2009-02-10 14 views
6

Mam zapytanie jak:Entity Framework dynamiczna klauzula WHERE

var function = GetSomeExpression();  

using (FooModel context = new FooModel()) 
{ 
    var bar = context.Bar.Where(function); 
} 

Chciałbym uczynić metoda rodzajowa, które można wykonać Gdzie wobec różnych podmiotów, w tym kontekście. Celem nie jest konieczności wykonywania context.Bar.Where, context.Car.Where, Context.Far.Where itd

coś, czego nie da się zrobić, ale ilustruje cel jest:

var q = context.GetObjectContext(T).Where(queryFunction); 

Przyjrzałem się użyciu Relfection i mogę uzyskać metodę Where, ale nie wiem, jak ją wykonać w kontekście kontekstu przekazującego delegata. Spojrzałem również na DynamicMethod, ale robienie całej IL-owej rzeczy nie podoba się atrakcyjnie.

Co mam tak daleko:

private List<T> GetResults<T>(Expression<Func<T, bool>> queryFunction) 
{ 
    // note: first() is for prototype, should compare param type 
    MethodInfo whereMethod = typeof(Queryable).GetMethods() 
     .Where(m => m.Name == "Where") 
     .First().MakeGenericMethod(typeof(T)); 

    // invoke the method and return the results 
    List<T> result = whereMethod.Invoke(
    // have the method info 
    // have the expression 
    // can reference the context 
    ); 

    throw new NotImplementedException(); 
} 

Czy jest to możliwe do zrobienia?

+0

próbowałem robić to jakiś czas temu i skończyło się na budowaniu repozytorium dla każdego z nich. Chciałbym wiedzieć, co myślą inni ludzie. Designer.cs generuje ctx.CreateQuery ("[Bar]"); – bendewey

Odpowiedz

7

To sposób łatwiej niż to, co starałem wcześniej:

private List<T> GetResults<T>(IQueryable<T> source, 
    Expression<Func<T, bool>> queryFunction) 
{ 
    return source.Where(queryFunction).ToList<T>(); 
}