Динамическое построение списка функций- затем применяется к запросу linq - PullRequest
2 голосов
/ 31 августа 2011

Не уверен, что это лучший подход, но вот мои мысли

Я использую Entity Framework Data Model v 4.1 - я пытаюсь построить оператор where динамически, чтобы мне не приходилось каждый раз запрашивать базу данных, вместо этого я могу создать «список» условных выражений, а затем применить их все в один раз, так что БД запрашивается только один раз, а не каждый раз, когда я добавляю свои новые условия - если это имеет смысл ...

вот что у меня есть

List<Func<Order, bool>> orderFunctions = new List<Func<Order, bool>>();
if (this.LoggedInUser.UserId == 9)
{
Func<Order, bool> deleg = o => o.Status.Equals(OrderStatus.NewOrder);
orderFunctions.Add(deleg);
}
else if (this.LoggedInUser.UserId == 22)
{
Func<Order, bool> deleg = o => o.AssignedToUserId.Equals(22);
orderFunctions.Add(deleg);
}
List<Orders> orders = Entities.Orders.Where( Some How Apply my Order Functions List Here ).ToList();

Я не уверен, что я даже выбрал правильный подход - надеюсь, это имеет смысл - любое руководство, пример кода было бы фантастическим, у меня есть куча времени, чтобы найти примеры / учебные пособия для этого онлайн

Ответы [ 2 ]

6 голосов
/ 31 августа 2011

Вы можете сделать это, просто позвонив Where несколько раз:

IQueryable<Order> query = Entities.Orders;

if (this.LoggedInUser.UserId == 9)
{
    query = query.Where(o => o.Status.Equals(OrderStatus.NewOrder));
}
else if (this.LoggedInUser.UserId == 22)
{
    query = query.Where(o => o.AssignedToUserId.Equals(22));
}

List<Order> orders = query.ToList();

Пока вы не попытаетесь получить результатов, он не будет связываться с базой данных.

Если вы действительно хотите создать список, вам нужно создать List<Expression<Func<Order, bool>>> - они должны быть деревьями выражений, а не делегатами, чтобы Entity Framework могла с ними работать. Тогда вы можете просто сделать:

foreach (var predicate in predicates)
{
    query = query.Where(predicate);
}

Или вы можете использовать PredicateBuilder для построения единого дерева выражений.

2 голосов
/ 31 августа 2011

Джон дал, конечно же, ответ, как это сделать лучше.

Но для вашей первоначальной точки зрения, и почему это не сработает:

Не сложно применитьсписок дыр (просто сделайте

x => orderFunctions.All(f => f(x))

), но вы не получите никакой SQL-любви от этого - это означает, что вы получите ошибку, потому что EF не может знать, что делать со всем (или с тем, что вы будете там кодировать)).Вам нужно будет запросить все записи (с ToList или ToArray), и после этого это будет работать ... но без производительности;)

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