我有一個正在查詢的物體框架資料庫,所以我使用的是 linq-to-entities。
這是我的查詢:
// 'Find' 只是一個回傳 IQueryable 的包裝方法
var q = r.Find(topic =>
topic.PageId != null &&
!topic.Page.IsDeleted &&
topic.Page.IsActive)
// 這些是標準的 EF 擴展方法,用于包含鏈接表。注意: Page_Topic 與 topic 是一對多的關系。
.Include(topic => topic.Page.Route)
.Include(topic => topic.Page_Topic.Select(pt => pt.Page.Route))
// 這里的問題:這個選擇陳述句需要展平Page_Topic(它確實)。但它似乎在錯誤的地方做。解釋一下,如果我要包含另一個依賴于 Page_Topic 的列(例如:'PillarRoutName2',我也必須對該列應用相同的展平邏輯。當然,過濾Page_Topic應該在查詢的更高層完成干燥方式。
.Select(x => new
{
TopicName = x.Name,
HubRouteName = x.Page.Route.Name,
PillarRouteName = x.Page_Topic.FirstOrDefault(y => y.IsPrimary).Page.Route.Name
}).ToList();
uj5u.com熱心網友回復:
當然,Page_Topic 的過濾應該以 DRY 方式在查詢的更高層進行。
正確的!這樣做很容易:
.Select(x => new
{
TopicName = x.Name,
HubRouteName = x.Page.Route.Name,
FirstTopic = x.Page_Topic.FirstOrDefault(y => y.IsPrimary)
})
.Select(x => new
{
TopicName = x.TopicName,
HubRouteName = x.HubRouteName,
PillarRouteName = x.FirstTopic.Page.Route.Name,
PillarRoutName2 = x.FirstTopic. ...
}).ToList();
根據您從哪里開始獲取屬性,FirstTopic您也可以使用x.Page_Topic.FirstOrDefault(y => y.IsPrimary).Page或.Page.Route在第一部分中。
請注意,您不需要Includes。它們將被忽略,因為查詢是投影 ( Select(x => new ...)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/408619.html
標籤:
上一篇:在每個第n個元素上創建字串陣列
