簡體   English   中英

使用 LINQ 按孫子過濾列表

[英]Filter list by grandchild using LINQ

我需要通過 DamageCode class 中的 DamageCodeName 字段過濾列表。

public partial class DamageCategory
{
    public string DamageCategoryId { get; set; }
    public string CategoryName { get; set; }
}

public partial class DamageGroup
{
    public string DamageGroupId { get; set; }
    public string DamageCategoryId { get; set; }
    public string GroupName { get; set; }
}

public partial class DamageCode
{
    public string DamageCodeId { get; set; }
    public string DamageGroupId { get; set; }
    public string DamageCodeName { get; set; }
}

我使用 EF CORE 5 將記錄拉到一個列表中:

private List<DamageCategory> _DamageCodeList { get; set; } = new();

_DamageCodeList = _contextDB.DamageCategories
                            .Include(i => i.DamageGroups)
                            .ThenInclude(d => d.DamageCodes).AsSingleQuery().ToListAsync();

現在我需要通過 DamageCode.DamageCodeName 屬性過濾這個列表。

private string _SearchText { get; set; } = "Bubble";
private List<DamageCategory> _CategoryList { get; set; } = new();

_CategoryList = _DamageCodeList.Where(g => g.DamageGroups.SelectMany(c => c.DamageCodes
                               .Where(w => w.DamageCodeName.ToLower().Contains(_SearchText.ToLower()))).Any()).ToList();

上面的代碼只過濾了 DamageCategory。 它帶回了 DamageGroup 的所有記錄和 DamageCodes 的所有記錄。

我需要 linq 查詢結果來生成如下列表(按“氣泡”過濾),並只帶回由 DamageCode.DamageCodeName.Contains(“Bubble”)過濾的 DamageCategory、DamageGroup 和 DamageCodes:

我需要像這樣結束過濾器的結果

這是產生上面我需要的結果的 SQL:

SELECT 
    CT.[DamageCategoryID],
    CT.[CategoryName],
    DG.[DamageGroupID],
    DG.[DamageCategoryID],
    DG.[GroupName],
    DC.[DamageCodeID],
    DC.[DamageGroupID],
    DC.[DamageCodeName]
  FROM 
    [dbo].[DamageCategory] AS CT
    INNER JOIN [dbo].[DamageGroup] AS DG ON CT.[DamageCategoryID] = DG.[DamageCategoryID]
    INNER JOIN [dbo].[DamageCode] AS DC ON DG.[DamageGroupID] = DC.[DamageGroupID]
  WHERE 
    DC.[DamageCodeName] LIKE '%Bubble%'

這就是查詢語法大放異彩的地方。

from dc in _contextDB.DamageCategories
from dg in dc.DamageGroups
from dc in dg.DamageCodes
where dc.DamageCodeName.Contains("Bubble")
select new
{
    dc.DamageCategoryID,
    dc.CategoryName,
    dg.DamageGroupID,
    dg.DamageCategoryID,
    dg.GroupName,
    dc.DamageCodeID,
    dc.DamageGroupID,
    dc.DamageCodeName
}

查詢形狀from... fromSelectMany的查詢語法等價物。

您在代碼中使用ToLower 那可能沒有必要。 查詢被翻譯成 SQL 並且如果數據庫字段具有不區分大小寫的排序規則,則不需要ToLower

暫無
暫無

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

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