Это совершенно невероятно FilterDate()
будет работать.Помните, что выражение, которое вы пишете в предложении Where()
, будет преобразовано в SQL и отправлено на SQL Server (или в другую БД) ... SQL Server не знает о FilterDate()
, и вы получите исключение (Entity Framework).
Можно создать метод FilterDate
, который возвращает Expression<>
, например
// Filter only for dates >= 1 jan 2000
public static Expression<Func<TSource, bool>> FilterDate<TSource>(Expression<Func<TSource, DateTime>> exp)
{
var body = exp.Body;
var date = new DateTime(2000, 1, 1);
// exp >= 1 jan 2000
var body2 = Expression.GreaterThanOrEqual(exp.Body, Expression.Constant(date));
var lambda = Expression.Lambda<Func<TSource, bool>>(body2, exp.Parameters);
return lambda;
}
, а затем
Expression<Func<Customer, bool>> filterA = x => x.Country == "USA";
Expression<Func<Customer, bool>> filterB = FilterDate<Customer>(x => x.DateMeeting);
и затем составьте это выражение, например, используя код из this ,
var filterC = filterA.And(filterb);
var usaCustomer = Context.Customer.Where(filterC);
, но поверьте мне, это боль с небольшим выигрышем.И это сложно.К сожалению, деревья выражений очень трудно составить.