我工作的一個小ASP.NET核心項目SQLite數據庫使用實體框架的核心標記圖像,主要只是爲了學習。有兩個表(和POCO),標籤和圖像,其中多個標籤與每個圖像相關。我試圖計算所有具有與它們關聯的標籤的圖像。EF核心的定製數查詢
在普通的SQL中,我會寫SELECT COUNT(DISTINCT ImageId) FROM Tags
來獲得計數,而在LINQ中,我想出了_context.Tags.Select(t => t.Image).Distinct().Count()
。但是,該LINQ查詢看起來會導致EF-Core連接兩個表,返回所有行,然後在代碼中執行Distinct
和Count
。
我試着做_context.Tags.FromSql("SELECT COUNT(DISTINCT ImageId) FROM Tags")
,但由於該查詢僅返回計數,因爲EF不能結果標籤映射調用失敗。我也嘗試使用_context.Database.FromSql<int>
,但無法找到任何真實文檔,並且似乎沒有IntelliSense。
我已經完蛋了,現在是什麼詳述此blog post from Eric Anderson的「ADO.NET」一節中:
int count;
using (var connection = _context.Database.GetDbConnection())
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT COUNT(DISTINCT ImageId) FROM Tags";
string result = command.ExecuteScalar().ToString();
int.TryParse(result, out count);
}
}
但是,這是最好的方式去有效地得到計數?
編輯:下面是EF在調試輸出把查詢:
SELECT "t"."TagId", "t"."Content", "t"."ImageId", "t.Image"."ImageId", "t.Image"."FileName", "t.Image"."Path", "t.Image"."Url"
FROM "Tags" AS "t"
LEFT JOIN "Images" AS "t.Image" ON "t"."ImageId" = "t.Image"."ImageId"
ORDER BY "t"."ImageId"
我已將調試輸出中顯示的查詢添加到我的問題中。我只是跨過了LINQ調用,從來沒有進入它。但是我會設置日誌記錄並查看在Release中運行時寫入的內容。 –
在調試或發佈中運行應該沒有什麼區別,但它值得一試。 – LittleDebugger
奇怪的是,查詢包含一個order by。如果您刪除了選擇,結果如何? _context.Tags.Distinct()。Count() – LittleDebugger