【问题标题】:How to write linq query for this SQL query?如何为此 SQL 查询编写 linq 查询?
【发布时间】:2021-01-15 03:09:21
【问题描述】:

如何为此 SQL 查询编写 linq 查询

select c.Name, Count(cb.Id) as Total1, Count(cf.Id) as Total2 
from Company c 
left join CompanyBDetails CB on C.Id = CB.CompanyId
left join CompanyFDetails CF on CF.BankId = CB.Id
group by C.Name

【问题讨论】:

  • 您应该尝试一下并发布您的尝试。我建议查看 GroupJoin 和 SelectMany 以实现左连接并使用 DefaultIfEmpty 测试左连接未命中。
  • 也许我的SQL to LINQ Recipe 可以帮助你。

标签: sql linq


【解决方案1】:

所以你有一个Companies的表,其中每个Company有零个或多个BDetails,每个BDetail都属于一个公司,即外键CompanyId所指的公司:一个简单的一对多关系。

同样,每一个BDetail有零个或多个FDetails,每一个FDetail恰好属于一个BDetail,即外键BDetail所指的BDetail。

对于每家公司,您都需要该公司的名称和该公司的 BDetails 数量。在我看来,您还想要该公司所有 BDetails 的 FDetails 总数。

var result = dbContext.Companies.Select(company => new
{
    Name = company.Name,

    BDetailIds = dbContext.BDetails
        .Where(bDetail => bDetail.CompanyId == company.Id)
        .Select(bDetail => bDetail.Id),
})

中间结果:对于每个公司,您都创建了一个对象,该对象包含公司的名称以及所有 BDetails 的 ID

继续 Linq:计算总数:

.Select(company => new
{
    Name = company.Name,

    // Total1 is the number of BDetails of this Company
    Total1 = company.BDetailIds.Count(),

    // Total2 is the number of FDetails of all BDetails of this Company
    // whenever you need the sub-items of a sequence of items, use SelectMany
    Total2 = company.BDetailIds
        .SelectMany(bDetailId => dbContext.FDetails.Where(fDetail => fDetail.BankId == bDetailId))
        .Count();
});

如果您想要更多的属性而不仅仅是总数:

var result = dbContext.Companies.Select(company => new
{
    // Select the company properties that you plan to use:
    Id = company.Id,
    Name = company.Name,
    ...

    BDetail = dbContext.BDetails
        .Where(bDetail => bDetail.CompanyId == company.Id)
        .Select(bDetail => new
        {
             // Select only the bDetail properties of the company that you plan to use
             Id = bDetail.Id,
             ...

             // not needed, you know the value:
             // CompanyId = bDetail.CompanyId,

             FDetails = dbContext.FDetails
                 .Where(fDetail => fDetail.BankId == bDetail.Id)
                 .Select(fDetail => new
                 {
                      // you know the drill by now: only the properties that you plan to use
                      Id = fDetail.Id,
                      ...
                 })
                 .ToList(),
        })
        .ToList(),
});

【讨论】:

  • 你好 Harald 谢谢你,你能不能用 count 和 group by 子句来解释查询表达式。我是实体框架的新手,无法在单个查询中使用 group by 连接所有三个表并计算行数。
  • 您应该已经添加了实体框架标签。因为那会导致完全不同的答案。我不知道你为什么要使用 LINQ GroupBy。你的要求和你说的不一样吗?给出一些代码然后说:我的代码不起作用,让我们猜测你打算做什么,这通常不是一个好主意。建议:编辑您的问题,描述表格的相关部分及其关系。并用文字描述您要查询的内容。尤其是文字描述可以帮助您创建正确的 LINQ。不要尝试将 SQL 转换为 LINQ
猜你喜欢
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多