簡體   English   中英

EF Core Include ThenInclude 過濾器

[英]EF Core Include ThenInclude Filter

我有以下數據庫結構

租戶(一對多)-> 站點(一對多)-> SiteUrl

public sealed class Tenant : Entity
{
    public IReadOnlyCollection<Site> Sites => _sites?.ToList();
}

public class Site : Entity
{
    public IReadOnlyCollection<SiteUrl> Urls => _urls?.ToList();
}

我正在嘗試使用 EF core 5.0 查詢數據,如下所示

var t = await tenants
                    .Include(t => t.Sites)
                    .ThenInclude(s => s.Urls.Where(su => su.Url == url))
                    .ProjectTo<TenantContextDto>(mapper.ConfigurationProvider)
                    .FirstOrDefaultAsync();

基本上,我試圖根據網站的 url 獲取租戶,但我沒有得到我期望的結果。 我已經嘗試了代碼的各種變體,但無法根據正在搜索的 url 找到正確的租戶/站點。

任何幫助/建議將不勝感激

謝謝大家的回復

在數據庫中我有租戶 1

當我搜索 localhost 時,我得到了正確的租戶、正確的站點,但我得到了 url localhost1。

Gert Arnold:謝謝你完全忘記了投影忽略包含,這是一篇很棒的文章,你指給我謝謝。

如果您想要具有匹配站點 URL 的租戶,則:

var t = await tenants
    .Where(t => t.Sites.Any(s=> s.Url == url))
    .ProjectTo<TenantContextDto>(mapper.ConfigurationProvider)
    .FirstOrDefaultAsync();

Include / ThenInclude當你想分別返回一個實體和急切加載相關實體和它們各自的相關實體時使用。 使用 Automapper 的ProjectTo或使用 Linq 的Select您不需要 Eager 加載,投影將根據需要加載數據。

如果要將租戶詳細信息 (DTO) 中的站點過濾為僅與 URL 匹配的數據,則需要將投影配置為僅查找與條件匹配的記錄。 如果您的 DTO 在其中包含站點結構,它將包含匹配租戶的所有站點,而不僅僅是具有目標 URL 的站點。

不要忘記,沿着 1:M 關系走另一條路(從 M 到 1)會更簡單一些:

context.SiteUrls.Where(su => su.Url == url).Select(su => su.Site.Tenant) ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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