Entity framework EF扩展函数

Entity framework EF扩展函数,entity-framework,linq-to-entities,entity-framework-4.1,Entity Framework,Linq To Entities,Entity Framework 4.1,我打算在同一个项目中同时使用LINQtoSQL和EF4.x(出于某种原因) 但EF中有一些东西,IMO是这样的“怪异”: db.SomeTable.Where(x => x.Date > DateTime.Now.Date); db.SomeTable.Where(x => x.Year == DateTime.Today.Year && x.Month == DateTime.Today.Month && x.Day == DateTime

我打算在同一个项目中同时使用LINQtoSQL和EF4.x(出于某种原因)

但EF中有一些东西,IMO是这样的“怪异”:

db.SomeTable.Where(x => x.Date > DateTime.Now.Date); 
db.SomeTable.Where(x => x.Year == DateTime.Today.Year && x.Month == DateTime.Today.Month && x.Day == DateTime.Today.Day)
必须这样写

db.SomeTable.Where(x => EntityFunctions.TruncateTime(x) > EntityFunctions.TruncateTime(DateTime.Now.Date)); 

有没有办法,我可以向EF添加功能,或者改变这种行为,因为LinqToSql没有这些奇怪的语法

没有办法改变EF动态解析查询的方式

您可以动态捕获查询并使用进行编辑,但这可能是一项相当大的工作


您可以重写查询,使其在这两种情况下都能工作,尽管实际上可以拦截查询并重写它。请参阅
IQueryable.Provider
IQueryable.Expression
属性。但是这需要编写一个定制的
ExpressionVisitor
来翻译调用,并且很快就会变得复杂

如果上面的代码是您遇到的Linq To SQL和EF之间唯一不匹配的代码,那么您可以像这样重写查询:

db.SomeTable.Where(x => x.Date > DateTime.Now.Date); 
db.SomeTable.Where(x => x.Year == DateTime.Today.Year && x.Month == DateTime.Today.Month && x.Day == DateTime.Today.Day)
我非常确定EF应该支持这种比较,Linq到Sql也应该支持这种比较


如果您想尝试第一种解决方案,我建议您为EF返回的
ObjectSet
创建一个
IQueryable
-包装器,并在执行简单查询时设置一个断点,查看表达式树在查询中的实际存储方式,这可能会给人留下一种印象,即寻找什么以及用什么替换它。

您是在寻找编写该lamda的通用方法,还是已经用linq2sql编写了linq2sql lamda,您希望在不更改代码的情况下将其移植到EF?@Stephenalcy我已经编写了针对LinqToSql的代码,我希望它能够与EF一起工作,而不需要任何EF的特定语法。