[英]How can I select from an included entity in LINQ and get a flat list similar to a SQL Join would give?
[英]How can I order in Linq Select Distinct if ordered by an Included entity?
我知道在Linq中,我必須在執行Select - Distinct
之后必須執行OrderBy
,但是我正在嘗試通過在Select
之后丟失的Included實體屬性進行訂購。
例如:
var accounts = _context.AccountUser
.Include(o => o.Account)
.Where(o => o.UserId == userId || o.Account.OwnerId == userId)
.OrderByDescending(o => o.LastAccessed)
.Select(o => o.Account)
.Distinct();
當我通過兩個不同參數中的一個or
兩個來執行Where
,很有可能獲得重復的結果。 這就是為什么我使用Distinct
的原因。
這里的問題是在執行Select
,我不再擁有LastAccessed
屬性,因為它不屬於所選實體。
我認為AccountUser
和Account
的結構可以從查詢本身推斷出來。
如果您設置了雙向導航屬性:
var accountsQuery = _context.AccountUser
.Where(o => o.UserId == userId || o.Account.OwnerId == userId)
.Select(o => o.Account)
.Distinct()
.OrderByDescending(a => a.AccountUser.LastAccessed);
選擇帳戶時,不需要.Include()
請記住,您從該帳戶訪問的所有相關實體都將被延遲加載。 我建議使用.Select()
提取展平的視圖模型或視圖模型層次結構,以便SQL加載所有需要的字段,而不是急於加載所有內容或觸發延遲加載。
由於LINQ並未實現DistinctBy
而LINQ to SQL並未實現采用IEqualityComparer
Distinct
,因此您必須使用GroupBy
+ Select
代替:
var accounts = _context.AccountUser
.Include(o => o.Account)
.Where(o => o.UserId == userId || o.Account.OwnerId == userId)
.GroupBy(o => o.Account).Select(og => og.First())
.OrderByDescending(o => o.LastAccessed)
.Select(o => o.Account);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.