簡體   English   中英

如果由包括的實體訂購,如何在Linq Select Distinct中訂購?

[英]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屬性,因為它不屬於所選實體。

我認為AccountUserAccount的結構可以從查詢本身推斷出來。

如果您設置了雙向導航屬性:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM