0

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 のすべてのレコードが返されます。

以下のようなリスト ("Bubble" でフィルタリング) を生成し、DamageCode.DamageCodeName.Contains("Bubble") でフィルタリングされた DamageCategory、DamageGroup、および DamageCodes のみを戻すには、linq クエリの結果が必要です。

このようなフィルターの結果を終了する必要があります

上記の結果を生成する 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%'
4

1 に答える 1