具有多重联接、计数和左联接的 SQL 到 LINQ

2024-03-21

我用多个语句编写了这个 SQL 请求JOIN(包括一个LEFT JOIN).
它给了我预期的结果.

SELECT DISTINCT c.Id, 
       c.Title, 
       COUNT(v.Id) AS 'Nb_V2',
       COUNT(DISTINCT v.IdUser) AS 'Nb_V1',
       r.cnt AS 'Nb_R'
FROM TABLE_C c
JOIN TABLE_V v on c.Id = v.Id
LEFT JOIN ( 
    SELECT Id, COUNT(*)  AS cnt 
    FROM TABLE_R 
    GROUP BY Id
) r ON c.Id = r.Id
WHERE c.IdUser = '1234'
GROUP BY c.Id, c.Title, r.cnt

但是,'我喜欢此请求的 Linq 等效项,将其放入我的应用程序的数据访问层。

我尝试过类似的东西:

var qResult = from c in dbContext.TABLE_C
              join v in dbContext.TABLE_V on c.IdC equals v.IdC
              join r in dbContext.TABLE_R on v.IdC equals r.IdC into temp
              from x in temp.DefaultIfEmpty()
              group x by new { c.IdC, c.Title /*miss something ?*/} into grouped
              select new
              {
                  IdC = grouped.Key.IdC,          --good result
                  Title = grouped.Key.Title,      --good result
                  NbR = grouped.Distinct().Count(t => t.IdC > 0), --good, but "t.Id > 0" seems weird
                  Count = --I'm lost. No idea how to get my COUNT(...) properties (Nb_V1 and Nb_V2)
              };

我尝试去适应这个问题 https://stackoverflow.com/questions/19356439/left-join-in-linq-to-entities但我不明白。我迷失了Count在分组的子请求内。
谁能解释我哪里错了?

专家提示:如果有人可以用 lambda 表达式编写等价的内容,那就加分了


将 SQL 转换为 LINQ 查询理解:

  1. 将子选择转换为单独声明的变量除非它们引用子选择之外的列,在这种情况下使用括号创建子查询。
  2. 按 LINQ 子句顺序翻译每个子句,翻译单个单子和聚合运算符 (DISTINCT, TOP, MIN, MAX等)转换为应用于整个 LINQ 查询的函数。
  3. 使用表别名作为范围变量。使用列别名作为匿名类型字段名称。
  4. 使用匿名类型(new { ... })对于多列(例如在groupby).
  5. Use First().field从中获取非键值groupby聚合范围变量。
  6. 使用 EF 或 EF Core 时,翻译JOIN导航属性中的子句可能使用.Include().
  7. 否则JOIN多个子句AND两个表之间的 ed 相等测试应转换为两侧的匿名对象equals.
  8. JOIN并非全部相等测试的条件AND必须使用处理where连接外部的子句,或带有叉积 (from ... from...) 进而where。如果你正在做LEFT JOIN, 添加一个 lambdaWhere连接范围变量和DefaultIfEmpty() call.
  9. LEFT JOIN是通过使用模拟into 连接变量并做另一个from the 连接变量其次是.DefaultIfEmpty().
  10. 翻译多个表FROM子句分成多个from条款。
  11. 翻译FROM T1 CROSS APPLY T2一分为二from条款,一项用于T1和一个用于T2.
  12. 翻译FROM T1 OUTER APPLY T2一分为二from条款,一项用于T1和一个用于T2,但添加.DefaultIfEmpty() to T2.
  13. Replace COALESCE与条件运算符 (?:)and a null test.
  14. 翻译IN to .Contains() and NOT IN to !...Contains(),使用文字数组或数组变量作为常量列表。
  15. 翻译x BETWEEN low AND high to low <= x && x <= high.
  16. 翻译CASE, ISNULL and IIF到三元条件运算符?:.
  17. SELECT *必须替换为 select range_variable 或连接(包含所有范围变量的匿名对象)。
  18. SELECT列必须替换为select new { ... }创建具有所有所需字段或表达式的匿名对象。
  19. 参考计算SELECT可以通过重复表达式或使用来翻译列let在第一次使用之前命名表达式。
  20. Proper FULL OUTER JOIN必须用一个处理扩展方法 https://stackoverflow.com/a/43669055/2557128.
  21. 翻译UNION to Concat除非两个子查询都是DISTINCT,在这种情况下你可以翻译为Union并留下DISTINCT.
  22. 翻译具有多个没有结果列的聚合查询GROUP BY使用单例GroupBy: add .GroupBy(r => 1) (or group...by 1 into g),然后翻译聚合函数Select new { }.
  23. 日期 数学 和其他一些典范 https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/canonical-functions可以使用以下方式访问函数EF.Functions获取一个实例DbFunctions类(EF 核心),EntityFunctions等级 (EF DbFunctions访问静态方法 (EntityFramework 6.x)。
  24. 翻译 SQLLIKE使用 (EF Core >= 2) 的表达式EF.Functions.Like(column, pattern)或 (EF 6.x)DbFunctions.Like(column, pattern).

将这些规则应用到 SQL 查询中,您将得到:

var subrq = from r in Table_R
            group r by r.Id into rg
            select new { Id = rg.Key, cnt = rg.Count() };

var ansq = (from c in Table_C
            join v in Table_V on c.Id equals v.Id
            join r in subrq on c.Id equals r.Id into rj
            from r in rj.DefaultIfEmpty()
            where c.IdUser == "1234"
            group new { c, v, r } by new { c.Id, c.Title, r.cnt } into cvrg
            select new {
                cvrg.Key.Title,
                Nb_V2 = cvrg.Count(),
                Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(),
                Nb_R = (int?)cvrg.Key.cnt
            }).Distinct();

lambda 翻译很棘手,但是转换LEFT JOIN to GroupJoin...SelectMany是所需要的:

var subr2 = Table_R.GroupBy(r => r.Id).Select(rg => new { Id = rg.Key, cnt = rg.Count() });
var ans2 = Table_C.Where(c => c.IdUser == "1234")
                  .Join(Table_V, c => c.Id, v => v.Id, (c, v) => new { c, v })
                  .GroupJoin(subr, cv => cv.c.Id, r => r.Id, (cv, rj) => new { cv.c, cv.v, rj })
                  .SelectMany(cvrj => cvrj.rj.DefaultIfEmpty(), (cvrj, r) => new { cvrj.c, cvrj.v, r })
                  .GroupBy(cvr => new { cvr.c.Id, cvr.c.Title, cvr.r.cnt })
                  .Select(cvrg => new { cvrg.Key.Title, Nb_V2 = cvrg.Count(), Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(), Nb_R = (int?)cvrg.Key.cnt });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有多重联接、计数和左联接的 SQL 到 LINQ 的相关文章

  • 如何对多行的一列值求和?

    我有这个表 我想添加几行的 change 列的值 或者更准确地说 从 ne 值为零的行到 ne 值为零的下一行 不是第二个本身 任何答案将不胜感激 rn date ne change 0 2008 12 07 0 10330848398 1
  • 分页错误:“跳过”方法仅支持 LINQ to Entities 中的排序输入。必须在方法“Skip”之前调用方法“OrderBy”

    我正在索引页上的 MVC 中进行分页 在这一行我收到错误 return View employee ToPagedList Page 1 3 这是索引方法 public ActionResult Index string searchBy
  • SQL UPDATE 语句根据另一个现有行更新列

    基本上我有一个与下表具有相似格式的表格 我想做的是根据这个逻辑更新 Col4 如果 Col2 为空 则用 Col3 更新 Col4 如果 Col2 不为 null 则在 Col1 中查找与 Col2 中的值匹配的值 使用 col3 中的相应
  • 如何计算 Postgres 上图表中所有连接的节点(行)?

    我的桌子有account id and device id One account id可以有多个device ids 反之亦然 我正在尝试计算每个连接的多对多关系的深度 Ex account id device id 1 10 1 11
  • 如何进行数据透视并计算列平均值

    我承认这是迄今为止我必须面对的最复杂的 SQL 语句之一 我在这件事上碰壁了 我希望有人能帮我一把 我在数据库中有这张表 Item ActiveTime sec DateTime 1 10 2013 06 03 17 34 22 gt Mo
  • 自动提取数据 - Oracle SQL Developer

    我通过 SQL Developer 连接到 Oracle 数据库 我想编写一个返回每月数据集的查询 然后将该数据提取到分隔文本文件中 我知道如何做到这一点就好了 我想知道是否有一种方法可以编写一个脚本来运行查询并在一年内逐月提取数据 这样我
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • 如何连续添加起始行和下一行的值

    我只想创建一个 sql 查询 结果就像图片上的那样 类似于 SQL 中的斐波那契数列 Ex Column 1 10 则 Result 列的值为 Result 10 因为这是第一行 然后假设column1第二行的值为50 那么Result第二
  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • SQL Server 2008 错误 233

    我正在使用以下 sql 脚本在 SQL Server 2008 中创建新登录名 CREATE LOGIN xyz WITH PASSWORD xyz DEFAULT DATABASE master DEFAULT LANGUAGE us e
  • 分组和切换列和行

    我不知道这是否会被正式称为枢轴 但我想要的结果是这样的 Alex Charley Liza 213 345 1 23 111 5 42 52 2 323 5 23 1 324 5 我的输入数据采用这种形式 Apt Name
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • 使用联接更新表?

    我正在尝试使用表 B 中的数据更新表 A 我以为我可以做这样的事情 update A set A DISCOUNT 3 from INVOICE ITEMS A join ITEM PRICE QUNTITY B on A ITEM PRI
  • postgresql:插入...(选择*...)

    我不确定它是否是标准 SQL INSERT INTO tblA SELECT id time FROM tblB WHERE time gt 1000 我正在寻找的是 如果 tblA 和 tblB 位于不同的数据库服务器中怎么办 Postg
  • H2 SQL 日期比较

    在 H2 数据库中 如何在 TIMESTAMP 类型的列上运行查询 SELECT FROM RECORDS WHERE TRAN DATE lt 2012 07 24 Try 2012 07 24
  • SQL Server:为什么 ISO-8601 格式的日期依赖于语言?

    我需要一些帮助来理解 SQL Server 中的日期格式处理 如果您尝试以下操作 它将返回正确的结果 SET LANGUAGE English SELECT CAST 2013 08 15 AS DATETIME 2013 08 15 00
  • 实体框架 - 绑定 WPF 树视图控件

    在服务类别表中 ParentCategoryId 是 ServiceCategoryId 它是父类别 我的类别可以有第 n 级层次结构 因此我需要使用树视图控件来呈现它 我怎样才能做到这一点 Thanks 你可以使用分层数据模板 http
  • IIF(...) 不是公认的内置函数

    我正在尝试在 Microsoft SQL Server 2008 R2 中使用它 SET SomeVar SomeOtherVar IIF SomeBool value when true value when false 但我收到一个错误
  • 如何在 Entity Framework Core 中按周分组?

    在实体框架 6 中我可以使用SqlFunctions DatePart http msdn microsoft com en us library dd487171 aspx method var byWeek data GroupBy x
  • MySQL 左连接 WHERE table2.field = "X"

    我有以下表格 pages Field Type Null Key Default Extra page id int 11 NO PRI NULL auto increment type varchar 20 NO NULL

随机推荐

  • 自定义添加到购物车按钮,将多个产品添加到购物车并添加数量:woocommerce

    我想创建自定义 添加到购物车 按钮 将我的 3 个产品添加到购物车 每个产品 2 个数量 为了将三个产品添加到购物车中 我已经使用了这样的方法 a class single add to cart button shop skin btn
  • 如何创建部分发票?

    我想从特定订单中为该订单中的某些选定项目创建发票 我已以编程方式成功为整个订单创建了发票 但我想创建该订单的部分发票 最后我明白了 必须挖 magento 才能得到这个 orderid order id order Mage getMode
  • 使用 asciidoctor 创建自定义 HTML

    我正在使用 CMS 来发布我的博客文章 我正在寻找一种从简单的文本文件离线创建 HTML 文章的方法 这是我通常在文章中使用的一段 HTML p We want to show how you can gather information
  • Spring Boot + 云 | Zuul代理 |集成测试

    当使用 Spring Boot 构建微服务时 可以非常轻松地编写大量且非常易读的集成测试并模拟远程服务请求MockRestServiceServer 有没有办法使用类似的方法来执行额外的集成测试ZuulProxy 我想要实现的是能够模拟远程
  • 为什么 C# 编译器在 IL 中发出额外的操作码?

    如果我有一个方法Multiply定义为 public static class Experiment public static int Multiply int a int b return a b 那么为什么编译器会发出这个IL met
  • Nativescript 错误:执行 webpack 失败,退出代码 1

    我已经在新的 iMac 运行 Big Sur 上按照说明仔细安装了 Nativescript 来自https docs nativescript org environment setup html macos ios https docs
  • 在模态页面表上呈现模态表单表

    在 iPad 上 我使用 modalPresentationStyle UIModalPresentationPageSheet 显示模式视图控制器 该视图控制器使用 modalPresentationStyle UIModalPresen
  • Angular 1.5 组件、ui-router 解析、$onChanges 生命周期挂钩

    在以下示例中 plunker https plnkr co edit ChxommnERTmaULmVRNY8 p preview ui router 状态路由到app组件有一个data对象和一个replace使用给定值用新对象替换该对象的
  • Scala specs2 模拟特征方法总是返回 Nullpointer 异常

    我有一个特征 我想在测试期间模拟并在另一个服务中使用该模拟特征 问题是 当我尝试模拟 indexDocuments 函数的返回值时 我收到 NullpointerException 测试方法 createDemand must return
  • Pandas 删除列包含 * 的行

    我试图删除此 df 中 DB Serial 列包含字符 的所有行 DB Serial 0 13058 1 13069 2 13070 3 13070 4 13044 5 13042 我在用 df df df DB Serial str co
  • 如何在 kotlin 中克隆或复制列表

    如何在 Kotlin 中复制列表 我在用着 val selectedSeries mutableListOf
  • 如何设置 raw_input 的时间限制

    在Python中 有没有一种方法可以在等待用户输入时计算时间 以便在30秒后 raw input 函数自动跳过 The 信号 警报 http docs python org library signal html highlight sig
  • 结构复杂的Git SVN克隆

    我需要将 SVN 存储库克隆到 git SVN 存储库的结构就好像它是存储库的存储库 如下所示 SVNRepo ProjectA branches tags trunk file ProjectB branches tags trunk f
  • 为 Content Delivery Web 服务配置环境数据框架时出错

    我正在为 Content Delivery Web 服务配置环境数据框架 当我在浏览器中点击我的服务 url 时 它会抛出以下错误 应用程序中的服务器错误 找不到声明处理器实现类 com tridion ambientdata proces
  • 期望整数表达式

    我想每 5 秒逐行读取我的文件 这次我只是尝试使用一行 bash 命令来执行此操作 bash 命令是 let X 1 while X lt 20 do cat XXX file head X tail 1 X X 1 sleep 5 don
  • Google Play 服务更新到版本 13 后出现错误

    我该如何解决这个错误 引起原因 java lang illegalargumentException 11 01 11 08 12 845 E AndroidRuntime 28885 引起 java lang IllegalStateEx
  • render_to_string方法中的Django自定义context_processors

    我正在构建一个发送电子邮件的函数 并且需要在电子邮件的 HTML 模板中使用 context processor 变量 但这不起作用 Example def send email plain body template name html
  • freopen 未写入指定文件

    我正在尝试使用文件重定向 stdout 和 stderr 的输出 我正在使用 freopen 它会在正确的目录中创建文件 但该文件是空白的 当我注释掉代码以重定向 stdout 和 stderr 时 输出显示在控制台上 这是代码 freop
  • 检查函数是否被修饰

    我正在尝试在类方法中构建一个控制结构 该方法将函数作为输入 并且如果函数被修饰或未修饰 则具有不同的行为 关于如何构建函数的任何想法is decorated其行为如下 def dec fun do decoration def func d
  • 具有多重联接、计数和左联接的 SQL 到 LINQ

    我用多个语句编写了这个 SQL 请求JOIN 包括一个LEFT JOIN 它给了我预期的结果 SELECT DISTINCT c Id c Title COUNT v Id AS Nb V2 COUNT DISTINCT v IdUser