我的 SQL Server 資料庫中有一個 header-detail 關系。我有大約 10k 個標題,每個標題都有 1-1k 個詳細資訊。并且唯一元素的數量大約為 1k。
Elements [id]
1
2
3
Headers [id]
1
2
3
Details [id, header_id, element_id]
1 1 1
2 1 2
3 1 3
4 2 1
5 3 1
使用這種結構查詢帶有詳細資訊的標題串列非常容易:
var searchHeaderIds = new List<int>{1,2,3};
var headers = context.Headers
.Where(h => searchHeaderIds.Contains(h.Id))
.Include(h => h.Details)
.ToList();
但是我要查詢的是一個元素串列(1-200),其中每個元素都有一個它所屬的標題串列(類似于倒置)。我可以用 C# 撰寫它,如下所示:
var searchElementIds = new List<int>{1,2,3};
var headers = context.Details
.Where(d => searchElementIds.Contains(d.element_id))
.GroupBy(d => d.element_id)
.Select(g => new {
id = g.Key,
header_ids = g.Select(x => x.header_id) })
.ToList();
但我想知道,使用 SQL/EF 的強大功能最快的方法是什么?
UPD:我準備好使用額外的資料結構,預處理資料庫中的資料,或者做任何其他事情來提高性能。
uj5u.com熱心網友回復:
關于什么:
var searchElementIds = new List<int>{1,2,3};
var headers = (
from header in context.Headers
join detail in context.Details on header.id equals detail.header_id
where searchElementIds.Contains(detail.element_id)
select header).Distinct();
如果你想要Element類的實體:
var headers =
context.Details
.Where(d => searchElementIds.Contains(d.element_id))
.GroupBy(d => d.element_id)
.Select(g => new Element
{
id = g.Key,
header_ids = g.Select(x => x.header_id
})
.ToList();
不要ToList()在查詢程序中呼叫。
uj5u.com熱心網友回復:
在您的情況下,這是最佳查詢。它更接近原始帖子,但減少了中間結果的檢索欄位數量:
var headers = context.Details
.Where(d => searchElementIds.Contains(d.element_id))
.Select(d => new { d.element_id, d.header_id })
.ToList() // we need this, EF do not support retrieving grouping detals
.GroupBy(d => d.element_id)
.Select(g => new Element
{
id = g.Key,
header_ids = g.Select(x => x.header_id).ToList()
})
.ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340100.html
標籤:C# sql-server 林克 实体框架核心
