【问题标题】:Linq left joining 3 tablesLinq 离开加入 3 个表
【发布时间】:2017-10-17 16:23:25
【问题描述】:

我正在尝试将以下查询转换为 lambda 表达式

var results = (from g in _groups
         join cr in _categoryRoots on g.Id equals cr.Group_Id into gcr
         from lgc in gcr.DefaultIfEmpty(new CategoryRoot())
         join c in _categories on lgc.Id equals c.CategoryRoot_Id into ccr
         from lccr in ccr.DefaultIfEmpty()
         select new GroupCategory
         {
             Id = g.Id,
             Name = g.Name,
             CategoryRoot_Id = lgc == null ? 0: lgc.Id,
             CategoryRootName = lgc == null ? "": lgc.Name,
             Category_Id = lccr == null ? 0: lccr.Id,
             CategoryName = lccr == null ? "": lccr.Name
         }).ToList();

想换成下面这样的东西。

var rs = _groups.Join(_categoryRoots, g => g.Id, cr => cr.Group_Id, (g, cr) => new GroupCategory { Id = g.Id, Name = g.Name, CategoryRoot_Id = cr.Id, CategoryRootName = cr.Name  });

运行代码示例https://dotnetfiddle.net/A3AO0V

【问题讨论】:

  • 那么,问题是什么?还是只是演示?
  • 你所说的lambda表达式是指_groups.Join(.....中的方法语法吗?
  • 为什么需要 lambda 语法?连接在 lambda 语法中是出了名的讨厌,而左连接更是如此。
  • 问题在工作示例中很清楚,我有 3 个表我想通过 lambda 表达式离开连接,@juharr 理解它。我也同意@D Stanley,如果 lambda 表达式不是此类查询的好选择,它是正确的答案,我能够得到我想要的输出,但我无法学习如何翻译成 lambda,只是想学习。
  • 我只想重申它是 METHOD SYNTAX,而不是 lambda 表达式或 lambda 语法。

标签: c# linq left-join


【解决方案1】:

我也不明白你真正要问什么,但我只是想分享一种简化你查询的方法。如果这样做,左连接就不会那么混乱了:

var results = (from g in _groups
               from lgc in _categoryRoots.Where(cr => g.Id == cr.Group_Id).DefaultIfEmpty(new CategoryRoot())
               from lccr in _categories.Where(c => lgc.Id == c.CategoryRoot_Id).DefaultIfEmpty()
               select new GroupCategory
               {
                   Id = g.Id,
                   Name = g.Name,
                   CategoryRoot_Id = lgc?.Id ?? 0,
                   CategoryRootName = lgc?.Name ?? "",
                   Category_Id = lccr?.Id ?? ',
                   CategoryName = lccr?.Name ?? ""
               }).ToList();

如果您至少使用 C# 6 (VS 2015),您可以利用空值合并运算符 ?. 来简化这些空值检查。

【讨论】:

  • 抱歉我的英语不好,我更新了问题。您是否同意@D Stanley 的观点,即 lambda 语法会使它变得不必要地复杂?只是想简化查询,因为您对此进行了一些思考。
  • 我认为它在我的答案中的方式比使用方法语法(就像您在问题中添加的_groups.Join(_categoryRoots...)更加清晰易读。你不同意吗?
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2015-07-28
相关资源
最近更新 更多