什麼是Entity Framework核心缺乏適度LINQ查詢支持的最佳解決方案?

.net c# entity-framework-core linq sql-server

所以基本上我有一個包含一組數據的表。然後將此數據連接到多個用戶可以分開的組織表。然後我試圖獲取用戶執行查詢的表中的所有文件,有權訪問該組織。為此,我使用where子句檢查用戶對應用程序的權限,以及組織鏈接的文件。然後我選擇前100個結果併計算返回的記錄。 (我想看看用戶是否可以訪問所有組織的100多個文件)。

問題是當我使用以下LINQ查詢時:

(from f in File
 join o in Organisation on f.OrganisationId equals o.Id
 where permissions.Contains(o.Id.ToString())
 select f).Take(100).Count();

當我在列表上嘗試包含應該轉換為SQL上的IN (VALUES)查詢的包含時,在SQL服務器上不執行takecount並在內存中運行。我有70,000多個文件記錄,這非常慢,並且在Web服務器上超時。這是預期的,因為實體框架核心處於早期階段,並且還不支持中等或高級LINQ查詢。

我的問題是,是否有更好的替代原始SQL查詢,同時仍然能夠過濾項目數組並仍然使用Entity Framework核心v1.1?謝謝。

編輯:我嘗試更新到最新版本,這仍然沒有解決我的問題,因為我仍然得到以下輸出。

The LINQ expression '{permissions => Contains([o].Id.ToString())}' could not be translated and will be evaluated locally.
The LINQ expression 'Contains([o].Id.ToString())' could not be translated and will be evaluated locally.
The LINQ expression 'Take(__p_1)' could not be translated and will be evaluated locally.
The LINQ expression 'Count()' could not be translated and will be evaluated locally. 

一般承認的答案

警告是誤導性的 - 問題是ToString()調用導致客戶端評估查詢。

以下應生成預期的SQL查詢:

var idList = permissions.Select(int.Parse);
var result = (
    from f in File
    join o in Organisation on f.OrganisationId equals o.Id
    where idList.Contains(o.Id)
    select f).Take(100).Count();

在我的環境中(EF Core v1.1.1)生成以下SQL而沒有警告(如預期的那樣):

SELECT COUNT(*)
FROM (
    SELECT TOP(@__p_1) [f].[Id], [f].[Name], [f].[OrganisationId]
    FROM [Files] AS [f]
    INNER JOIN [Organisations] AS [o] ON [f].[OrganisationId] = [o].[Id]
    WHERE [o].[Id] IN (1, 3, 4)
) AS [t]


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow