Во-первых, я должен сказать, что я прочитал несколько постов об этом в StackOverflow, но не могу получить желаемый результат.
Позвольте мне объяснить контекст (упрощенно): я использую Linq-to-SQL, чтобы запрашивать клиентов о последних посещениях магазина и (опционально) получать только тех, у кого определенная сумма платежей. Предположим, у меня есть модель с классами клиентов, посещений и платежей.
Итак, фокусируясь на выражении Where
, я пытаюсь это:
Expression<Func<Entityes.Clients, bool>> filter = null;
filter = c =>
c.Visits.Any(v => v.VisitDate > DateTime.Now.Date.AddMonths(-(int)visitsSince));
if (minPayment.HasValue && minPayment.Value > 0)
{
filter.And(
c => c.Payments.Sum(p => p.Quantity) > minPayment.Value);
}
Метод filter.And
- это метод расширения, рекомендуемый на этом форуме, ниже вы можете увидеть определение:
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1,
Expression<Func<T, bool>> expression2)
{
InvocationExpression invokedExpression =
Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
}
Однако, это не работает для меня, как ожидалось, и результаты не фильтруются по сумме платежа. Нет ошибки с данными или моделью linq-to-sql, потому что этот код работает нормально:
filter = c =>
c.Visits.Any(v => v.VisitDate > DateTime.Now.Date.AddMonths(-(int)visitsSince)))
&& c => c.Payments.Sum(p => p.Quantity) > minPayment.Value;
Однако я не хочу использовать последний код, потому что у меня есть несколько более сложных сценариев, в которых мне нужно поэтапно создавать выражение фильтра с комбинацией 'и / или' каждой части.
PD: Я - парень из ADO.Net DataSets, пытающийся изучить Linq-to-SQL и вскоре Entity Framework, надеюсь, скоро он будет полезен сообществу StackOverflow.