2012-12-13 13 views
15

mam tę metodę, która próbuje uzyskać listę rzeczy:Wracając pusty IQueryable <>

private static IQueryable<Thing> GetThings(int thingsType) 
     { 
       try 
       { 
        return from thing in entities.thing.Include("thingStuff") 
          select thing; 
       } 
       catch (Exception exception) 
       { 
        return new EnumerableQuery<Thing>(?????); 
       } 
      } 

     } 

chcę wrócić pusty IQueryable jeśli nie z jakiegokolwiek powodu może dostać zapytanie do uruchomienia. Nie chcę zwracać NULL, ponieważ może złamać kod wywołujący. Czy to możliwe, czy też całkowicie się mylę?

Odpowiedz

33

Odpowiedzi te są dobre i wykonywać pracę, ale zawsze czułem użyciu Empty a nie tworzenie nowej listy jest czystsze:

Enumerable.Empty<Thing>().AsQueryable(); 
+0

To jest świetna odpowiedź. – Irwin

+1

Należy jednak pamiętać, że jeśli korzystasz z opcji oczekuj/asynchronizuj z EF6, otrzymasz następujący wyjątek: https://msdn.microsoft.com/en-us/data/dn313107.aspx - Sprawdź ten link pod kątem asynchronizacji - http://stackoverflow.com/questions/33305495/how-to-return-empty-iqueryable-in-anynas-repository-method – jabko87

9

Spróbuj wykonać następujące czynności:

private static IQueryable<Thing> GetThings(int thingsType) 
    { 
      IQueryable<Thing> things = new List<Thing>().AsQueryable(); 
      try 
      { 
       things = from thing in entities.thing.Include("thingStuff") 
         select thing; 

       return things; 
      } 
      catch (Exception exception) 
      { 
       return things; 
      } 
     } 
+0

To wygląda obiecująco, spróbuję, dzięki! –

+0

@mreyeros Nigdy nie zwracasz niczego, jeśli nie został zgłoszony wyjątek. Być może chciałeś w końcu włożyć swój powrót? – cadrell0

5

Dodam blok finally {} i umieścić mój typ zwracany w tym kodzie.

To zajmie się problemem, zwracając typ oczekiwany przez aplikację.

private static IQueryable<T> GetThings(int thingsType) 
    { 
      IQueryable<T> list = new List<Thing>().AsQueryable(); 
      try 
      { 
       list = from thing in entities.thing.Include("thingStuff") 
         select t; 
      } 
      catch (Exception exception) 
      { 
       // handle exception here; 
      } 
      finally {  
       return list; 
      } 

     } 

    } 
+2

Zdecydowanie się zgadzam, wyjątek powinien być obsługiwany w jakiś sposób, a następnie wywołanie zwracania pustej listy powinno zostać zwrócone w bloku finally. – mreyeros

+0

Dzięki, to tylko trochę bardziej defensywny styl kodowania :) –

1

myślę, że to byłoby porządniej:

private static IQueryable<T> GetThings(int thingsType) 
{ 
    try 
    { 
     return from thing in entities.thing.Include("thingStuff") 
        select t; 
    } 
    catch (Exception exception) 
    { 
     // Exception handling code goes here 

     return new List<Thing>().AsQueryable(); 
    } 
} 
1

Wracając pusty IQueryable <> DbSet.Take (0)

+0

Czy chcesz dodać wyjaśnienie odpowiedzi? –

+1

Mimo że problem mógł rozwiązać użytkownik, odpowiedzi tylko na kod nie są zbyt pomocne dla użytkowników, którzy przyjdą na to pytanie w przyszłości. Zmień odpowiedź, aby wyjaśnić, dlaczego Twój kod rozwiązuje pierwotny problem. –

Powiązane problemy