【问题标题】:C# Linq Include() with where()C# Linq Include() 与 where()
【发布时间】:2023-02-11 01:10:43
【问题描述】:

有一个看起来像这样的查询

var myResult = await _context.Families.AsNoTracking().AsSplitQuery()
                    .Include(f => f.Dogs.Where(d => d.Name == "someName"))
                    .Where(f => f.Breed == "some breed")
                    .Where(f => f.Dogs.Count > 0)
                    .ToListAsync(cancellationToken);

使用了虚拟数据*

在我的查询中,我发现 include 语句按预期工作,但最后一个 .Where() 不是。我打算过滤所有“家庭”,他们有一只狗,名字 ==“someName”,品种 ==“some breed”。要点是,我只想返回名称 == "someName" 的狗列表中的狗

我发现最后一个 Where() 子句正在对整个狗列表进行 .count,而不是我们希望在响应中过滤的包含的狗。

当然可以在最后一个 .Where() 中复制 f.Dogs.Where(mp => mp.Name == "someName") 但是如果不重复逻辑就没有办法做到这一点。

  • 需要拆分查询。包含多个包含的查询要大得多,但为了发布而将其缩短

我错过了什么

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    鉴于您已经缩短了对帖子的查询,我要说的可能适用也可能不适用。

    警告仅当 Families 和 Dogs 之间存在数据库关系(我假设有).

    可以简化此查询,这样您就不会在数据库上运行多个查询。这个查询对你有帮助吗?

        var myResult = await _context.Families
                        .Join(Dogs, fam => fam.Id, dog => dog.FamilyId, 
                                (fam, dog) => new { fam, dog })
                        .Join(Breeds, a => a.dog.BreedId, breed => breed.Id, 
                                (a, breed) => new { 
                                    Family = a.fam,
                                    Dog = a.Dog, 
                                    Breed = breed 
                                })
                        .Where(m => m.Dog.Name == "someName"
                            && m => Breed.Name == "some breed")
                        .AsNoTracking()
                        .ToListAsync(cancellationToken)
                        .GroupBy(g => g.Family)
                        .Where(r => r.Count() > 0);
    

    这将允许您在不将子选择放入非常低效的 where 子句的情况下进行查询。 ToList 或 ToListAsync 将导致您的查询运行。你得到你的结果,然后你可以过滤掉任何没有至少一只狗的家庭。当然,我可能在不知道您的确切架构的情况下假设了某些东西或错过了其他东西。如果您需要更多帮助,请告诉我您的基本架构,我可以尝试提出其他建议。

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      • 2011-05-07
      • 1970-01-01
      • 2019-05-30
      • 2014-09-17
      相关资源
      最近更新 更多