由於EF4無法將某些表達式轉換爲SQL,因此我們在相當大的系統中使用EF4並偶爾遇到問題。目前,我們或者需要做一些奇特的步法(DB/Code),或者只是接受性能命中,並允許查詢在內存中執行。擴展EF4 SQL生成
不用說,這些都不是理想的,我們有時不得不使用的黑客降低可讀性/可維護性。
我們理想的想法是擴展EF4 SQL提供程序的SQL生成功能。很明顯,有些東西就像.Net方法調用一樣必須是客戶端,但是一些功能比如日期比較(例如[Linq到Entities的星期幾組)應該可用。
我已經谷歌搜索,但也許我使用錯誤的術語,因爲我所得到的是有關EF4 SQL生成的新功能的信息。
對於這樣一個靈活和可擴展的框架,如果這是不可能的,我會感到驚訝。在我的腦海中,我想象着從[SQL 2008]提供者繼承,並將其擴展爲處理其轉換爲SQL的表達式樹中的其他表達式/類似表達式。
任何幫助/指針讚賞。
我們使用VS2010 Ultimate,.Net 4(非客戶端配置文件)和EF4。該應用程序在ASP.Net,並在64位環境中運行,以防有所作爲。
更新:迴應一些澄清要求;
我們使用的是代碼優先的方法,並有一個控制檯應用程序來創建數據庫並填充一些引用表。
我寧願遠離存儲過程,除非它們也可以以類似的方式生成 - 目前,根據需要生成數據庫的新版本,並且單獨的過程會遷移/同步數據。 一切我們目前正在處理數據庫使用實體。我承認我不能給出一個很好的理由,但是在這種情況下運行SQL腳本來生成存儲過程感覺不對 - 但是如果我錯了,請糾正我的錯誤。
關於具體情況,恐怕我不能在沒有經過冗長的繁文exercise節練習的情況下從我們的代碼中提供一個代碼 - link mentioned above是我們嘗試的那類事情的一個很好的例子完成。在這個例子中,實現一種機制,允許日期計算:
DateTime firstDay = GetFirstDayOfFirstWeekOfYear();
var userTimes = from t in context.TrackedTimes
group t by new {t.User.UserName, WeekNumber = (t.TargetDate - firstDay).Days/7} into ut
select new
{
UserName = ut.Key.UserName,
WeekNumber = ut.Key.WeekNumber,
Minutes = ut.Sum(t => t.Minutes)
};
我可以看到一個辦法,這可以使用SQL孤單但不知道如何使用LINQ到實體(服務器端)做它來完成。
很難回答這樣一個抽象的問題。你正準備支持什麼呢?有很多種方法來做這些事情(EdmFunctions,商店查詢,執行文字SQL等)。 – 2010-06-08 14:15:08
確實 - 我已經擴展了這個問題來包含一個例子。我希望這更清楚? – Basic 2010-06-08 16:51:25