【问题标题】:Filter list by grandchild using LINQ使用 LINQ 按孙子过滤列表
【发布时间】:2022-01-23 20:47:22
【问题描述】:

我需要通过 DamageCode 类中的 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 查询结果来生成如下列表(按“Bubble”过滤),并只带回按 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%'

【问题讨论】:

    标签: linq .net-core filter children grandchild


    【解决方案1】:

    这就是查询语法的亮点。

    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

    【讨论】:

    • 完美运行。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2016-12-09
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多