簡體   English   中英

Linq 一對多帶濾波器

[英]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.

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