[英]Linq one to many with filter
我有一個正在查詢的實體框架數據庫,所以我使用的是 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))
// 這里是問題:這個 select 語句需要展平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();
當然,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
。
請注意,您不需要Include
s。 它們將被忽略,因為查詢是投影( Select(x => new...
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.