Entity Framework Dynamic Where - PullRequest
       9

Entity Framework Dynamic Where

6 голосов
/ 10 февраля 2009

У меня есть запрос вроде:

var function = GetSomeExpression();    

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

Я хотел бы создать универсальный метод, который может выполнять Where для разных сущностей в контексте. Цель не в том, чтобы делать контекст. Бар. Где, контекст. Авто. Где, Контекст. Фар. Где и т. Д.

То, что не может быть сделано, но иллюстрирует цель:

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

Я рассмотрел использование Relfection и могу получить метод Where, но не знаю, как его выполнить в контексте, передаваемом в делегате. Я также посмотрел на DynamicMethod, но выполнение всего этого IL не нравится апелляции.

Что у меня так далеко:

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();
}

Возможно ли это сделать?

Ответы [ 2 ]

7 голосов
/ 10 февраля 2009

Это намного проще, чем я пытался раньше:

private List<T> GetResults<T>(IQueryable<T> source, 
    Expression<Func<T, bool>> queryFunction)
{
   return source.Where(queryFunction).ToList<T>();
}
1 голос
/ 10 февраля 2009

см. Этот пост

ССЫЛКА на сущности - Построение выражений where для проверки коллекций в рамках отношения многие ко многим

Редактировать : после обновления сообщения это больше не актуально; Я оставлю это на случай, если это будет полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...