【问题标题】:Join where lambda query in EF Core 3.1在 EF Core 3.1 中加入 where lambda 查询
【发布时间】:2021-09-22 13:50:45
【问题描述】:

我在 lambda 查询中写这个 sql 查询有问题:

select c.Id, c.Name, c.SomeNumber, count(*) from TableA a
  inner join TableB b
  on a.Id = b.aId
  inner join TableC c
  on c.BId = b.Id
  where b.Status = N'Approved'
  and c.Scope = N'Scope1'
  group by a.Id, a.Name, a.SomeNumber

你们能帮我解决这个问题吗?我想编写 lambda 查询以在代码中执行此操作。我正在使用 EF Core 3.1

这是我到目前为止的结果:

var query = await _dbContext.TableA.Where(a => a.TableB.Any(b => b.Status.Equals("Approved")
                && b.TableC.Any(c => c.Scope.Equals("Scope1"))))
                .GroupBy(g => new { Id = g.Id, Name = g.Name, SomeNumber = g.SomeNumber })
                .Select(s => new { Id = s.Key.Id, Name = s.Key.Name, SomeNumber = s.Key.SomeNumber, Count = s.Count() })
                .GroupBy(g => g.Id).Select(s => new {Id = s.Key, Count = s.Count()}).ToListAsync();

【问题讨论】:

  • 你试过了吗?这条 SQL 没有什么特别复杂的地方。
  • 是的,我试过了。我有一个问题,我无法使用 EF Core 在 count() 中获得相同的结果。哦,问题是我不想只使用 Join() 包含
  • 显示您的尝试,我们将更正您的查询。
  • 抱歉,我编辑了我的帖子。
  • 你的数据模型有导航属性吗?

标签: c# .net linq lambda entity-framework-core


【解决方案1】:

嗯,这是更正的查询。我使用了查询语法,当查询有很多连接或SelectMany 时更具可读性。

var query = 
    from a in _dbContext.TableA
    from b in a.TableB
    from c in b.TableC
    where b.Status == "Approved" && c.Scope == "Scope1"
    group a by new { a.Id, a.Name, a.SomeNumber } into g
    select new 
    {
        g.Key.Id,
        g.Key.Name,
        g.Key.SomeNumber,
        Count = g.Count()
    }

var result = await query.ToListAsync();

【讨论】:

  • 你就是男人!它工作完美。谢谢你:)
【解决方案2】:

从多端开始并通过导航属性进行处理可能更容易

tableC
  .Where(c => c.Scope == "Scope1" && c.BEntity.Status == "Approved")
  .GroupBy(c => new 
    {
      c.BEntity.AEntity.Id,
      c.BEntity.AEntity.Name,
      c.BEntity.AEntity.SomeNumber
    })
  .Select(g => new { g.Key.Id, g.Key.Name, g.Key.SomeNumber, Ct = g.Count()})
  

当您在 where 中的对象树中导航时,EF 知道如何进行连接。通过从多个开始并一直到关系的第一个结束,这意味着您不必复杂地询问“这个父母的任何孩子是否有...的状态”

【讨论】:

  • 很有趣,我会试试这个,让你知道它的表现。
  • 也可以
猜你喜欢
  • 2021-10-15
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 2019-06-16
相关资源
最近更新 更多