Factorise Common 过滤器在 linq to entities
Factorise Common filter in linq to entities
我正在尝试分解一些代码。我有很多自定义对象列表。所有这些都根据他们自己的特定字段和他们的日期之一进行过滤。过滤日期很复杂,我想分解它。这是一些代码示例:
var usaCustomer = Context.Customer.Where(x => x.Country == "USA" && FilterDate(x.DateMeeting)).ToList() ;
var happySeeder = Context.Seeder.Where(x => x.Feel == "Good" && FilterDate(x.LastConnection)).ToList() ;
所以问题是我如何声明 FilterFunction 以对给定的日期时间进行一些检查,或者我如何更改我的 where 子句以具有自定义过滤器和通用过滤器?
提前致谢。
FilterDate()
不太可能奏效。请记住,您在 Where()
子句中编写的表达式将被翻译为 SQL 并发送到 SQL 服务器(或其他数据库)... SQL 服务器不会不知道 FilterDate()
,你会得到一个例外(由 Entity Framework)。
可以创建 FilterDate
方法 returns 和 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);
但是请相信我,这是一种痛苦,收获甚微。而且很复杂。可悲的是,表达式树很难组合。
我正在尝试分解一些代码。我有很多自定义对象列表。所有这些都根据他们自己的特定字段和他们的日期之一进行过滤。过滤日期很复杂,我想分解它。这是一些代码示例:
var usaCustomer = Context.Customer.Where(x => x.Country == "USA" && FilterDate(x.DateMeeting)).ToList() ;
var happySeeder = Context.Seeder.Where(x => x.Feel == "Good" && FilterDate(x.LastConnection)).ToList() ;
所以问题是我如何声明 FilterFunction 以对给定的日期时间进行一些检查,或者我如何更改我的 where 子句以具有自定义过滤器和通用过滤器?
提前致谢。
FilterDate()
不太可能奏效。请记住,您在 Where()
子句中编写的表达式将被翻译为 SQL 并发送到 SQL 服务器(或其他数据库)... SQL 服务器不会不知道 FilterDate()
,你会得到一个例外(由 Entity Framework)。
可以创建 FilterDate
方法 returns 和 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);
但是请相信我,这是一种痛苦,收获甚微。而且很复杂。可悲的是,表达式树很难组合。