2009-09-26 18 views
6

Używam rodzajowe repozytorium wzór z metod repozytorium wzór:Entity Framework i problemem

private ObjectQuery<T> ObjectQueryList() 
    { 
     var list = CamelTrapEntities.CreateQuery<T>(EntitySetName); 
     return list; 
    } 

public IQueryable<T> List() 
    { 
     return ObjectQueryList(); 
    } 

Metod List() zwraca IQueryable < T >, becase IQueryable < T > jest łatwo drwić. Mam też metodę rozszerzenia:

public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path) 
    { 
     if (obj is ObjectQuery<T>) 
      (obj as ObjectQuery<T>).Include(path); 

     return obj; 
    } 

Metoda ta jest stosowana poza repozytorium, aby uzyskać listę podmiot posiadający właściwości nawigacyjnych już załadowany, na przykład: List.Include („CreatedBy”). Problem polega na tym, że nie działa. Wszystkie uwzględnienia są ignorowane. przy zmianie listy() w celu

public ObjectQuery<T> List() 
    { 
     return ObjectQueryList(); 
    } 

wszystko działa poprawnie.

Jak zastosować szablon repozytoriów, aby móc wykonywać bardziej złożone zapytania?

Odpowiedz

6

Reflektor dał mi odpowiedź:

public ObjectQuery<T> Include(string path) 
{ 
    EntityUtil.CheckStringArgument(path, "path"); 
    return new ObjectQuery<T>(base.QueryState.Include<T>((ObjectQuery<T>) this, path)); 
} 

Dołącz Przywraca nowy obiekt ObjectQuery i mój Dołącz funkcja powrócił stary obiekt. Zmiana na

public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path) 
{ 
    if (obj is ObjectQuery<T>) 
     return (obj as ObjectQuery<T>).Include(path); 

    return obj; 
} 

rozwiązało problem. Kilka godzin stracone i nienawidzę Entity Framework więcej :)

Uświadomiłem sobie również, że powinienem stworzyć kolejną funkcję List z parametrem Uwzględnij i nie zezwalać na to, aby zawierał zewnętrzne repozytorium.

1

Here to najbardziej kompleksowa implementacja schematu Repozytorium, którą widziałem dla EF. Nie mogę powiedzieć na pewno, czy pozwoli to na włączanie funkcji Include(), ale jeśli dobrze ją przeczytam, powinien.

1

z EntityFramework 4.1 DbExtensions (System.Data.Entity.DbExtensions) rozwiązuje ten problem i natywny dodaje zarówno .Include([string path]) i .Include([property expression]) jakiegokolwiek IQueryable<T>.

Po prostu upewnij się, że projekt wykorzystujący repozytorium odwołuje się do EntityFramework i, podobnie jak w przypadku innych metod rozszerzeń, w pliku klasy określ using System.Data.Entity;, aby uzyskać dostęp do tych rozszerzeń.