1

我有以下Linq To Entites查詢。當我從控制檯應用程序執行此查詢時,它會生成SQL並完美執行。實體框架Min Aggregate在網站上崩潰,但在控制檯應用程序上運行?

但是,當我從Web應用程序執行它時,我收到一條錯誤消息,說Min()函數不能被Linq To Entites識別,並且它不能被轉換爲存儲表達式。

這是完全相同的查詢。兩個項目在配置文件中都具有相同的設置(涉及EF 6),並且它們引用相同的程序集。

from ce in db.CustomEvents 
where ce.fld_start > DateTime.Now 
group ce by ce.fld_ownerId into g 
select new 
{ 
    fld_ownerId = g.Key, 
    next_appointement_date = g.Min(i => i.fld_start) 
} 

看來出現這種情況只有在MIN聚合是DateTime的屬性。例如,當我在小數點上有Min時,我沒有這個問題。

錯誤消息,當我在網站上執行此我得到的是這種

LINQ to Entities does not recognize the method 'System.Nullable`1[System.DateTime] 
Min[CustomEvent](System.Collections.Generic.IEnumerable`1[CustomEvent], 
System.Func`2[CustomEvent,System.Nullable`1[System.DateTime]])' 
method, and this method cannot be translated into a store expression. 

但是,當我從控制檯應用程序執行它,它成功地產生下面的SQL語句

SELECT 
1 AS [C1], 
[GroupBy1].[K1] AS [fld_ownerId], 
[GroupBy1].[A1] AS [C2] 
FROM (SELECT 
    [Extent1].[fld_ownerId] AS [K1], 
    MIN([Extent1].[fld_start]) AS [A1] 
    FROM [dbo].[mtbl_CustomEvent] AS [Extent1] 
    WHERE [Extent1].[fld_start] > (SysDateTime()) 
    GROUP BY [Extent1].[fld_ownerId] 
) AS [GroupBy1] 

有誰知道發生了什麼?爲什麼相同的查詢在控制檯應用程序中運行時會生成SQL,但在網站中運行時會失敗併產生異常?

UPDATE:

看來這個問題是的Min<T>(this IEnumerable<T>)兩種不同的實現之間的模糊性(.NET的實現,和我們自己的實現)。刪除「使用OurLibrary;」該文件的命名空間解決了問題。

+0

控制檯應用程序和Web應用程序是否以.net的相同版本爲目標? – vittore

+0

當你連接到w3並逐步完成查詢時,你也有同樣的問題嗎? – vittore

+0

是的,兩者都是同一解決方案中的項目。 .net 4.5.1,EF6。我打開一個DbContext,執行查詢。ToList()最後,我處理了DbContext。 我附加調試器時遇到同樣的問題。沒有不同。但是,當我取一個小數的屬性,而不是一個DateTime屬性,我沒有這個問題。 對我來說似乎很奇怪。錯誤可能? –

回答

1

維託雷的建議,使用擴展方法的語法,我們發現問題是在web項目中,我們引用我們的圖書館,其中包括的Min<T>(this IEnumerable<T>)實施方案的一個,而且我們也有文件中using OurLibrary.Namespace;指令在LINQ查詢後是。

當我們使用linq語法時,編譯器選擇了我們對查詢的Min實現,並沒有拋出任何錯誤。然後,在運行時,LINQ to Entities框架崩潰,因爲它無法識別我們的Min的實現。

from ce in db.CustomEvents 
where ce.fld_start > DateTime.Now 
group ce.fld_start by ce.fld_ownerId into g 
select new 
{ 
    fld_ownerId = g.Key, 
    next_appointement_date = g.Min() 
} 

這裏沒有編譯器錯誤。

但是當我們使用擴展方法語法時,編譯器停止了模糊性錯誤,這就是我們如何識別問題。

db.CustomEvents 
.Where(ce => ce.fld_start > DateTime.Now) 
.GroupBy(ce => ce.fld_ownerId, ce => ce.fld_start) 
.Select(g => new { g.Key, next_appointement_date = g.Min() }) 

這裏編譯器扔曖昧通話的錯誤.Min

這很奇怪,編譯器無法識別的歧義LINQ的語法。畢竟,linq只是語法糖。

+0

很高興你解決了! – vittore

相關問題