2011-11-28 173 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/進行編輯,但這可能是一項相當不錯的工作。

你可以重寫查詢,以便它可以在兩個雖然