2011-11-28 176 views
1

我是打算使用这两种LINQ to SQL和EF 4.x中,在同一个项目(出于某种原因),EF扩展功能

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

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

必须以这种方式

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

写有什么办法,我可以添加相应的功能,以EF,或改变这种行为,因为LinqToSql没有这些奇怪的语法

+0

您是在寻找一种通用的方式来编写lamda,或者您是否已经有了以linq2sql方式编写的linq2sql lamdas,您希望在不更改代码的情况下将其移植到EF中? –

+0

@StephenLacy我已经编写了针对LinqToSql的代码,我希望它能够与EF一起工作,而不需要任何EF的特定语法。 –

回答

1

其实这是可以拦截查询,并重写。请参阅IQueryable.ProviderIQueryable.Expression属性。但是这涉及到编写一个自定义的ExpressionVisitor来翻译这个电话并且很快就变得复杂。

如果上面这段代码是LINQ到SQL之间的唯一失配和EF你遇到,你可以重写本查询:

db.SomeTable.Where(x => x.Year == DateTime.Today.Year && x.Month == DateTime.Today.Month && x.Day == DateTime.Today.Day) 

我敢肯定,EF应该支持这种比较和所以应该Linq-To-Sql。

如果你想尝试的第一个解决方案,我建议你创建一个IQueryable<T> -wrapper由EF返回ObjectSet<T>并进行简单的查询时,设置一个断点,看到了表达式树是如何实际存储的查询中,这可能给人一种寻找什么和替换它的印象。

1

无法改变EF解析查询的方式。

您可以即时捕获查询并使用http://metalinq.codeplex.com/进行编辑,但这可能是一项相当不错的工作。

你可以重写查询,以便它可以在两个虽然