【问题标题】:Linq Expression: Left Join Duplicating RowsLinq 表达式:左连接重复行
【发布时间】:2016-03-04 04:54:54
【问题描述】:

我正在尝试执行此 Linq 表达式,但 LEFT JOIN 正在复制行。
当我在 SQL 中编写这个完全查询时,它工作正常,但是当我在 Linq 表达式中编写它时,LEFT JOIN 复制了该行。
我试图分组..但我得到了相同的结果。

var sql = (from project in db.Project
                   join suitT in db.SuitT
                       on project.Id equals suitT.IdProject

                   join inspec in db.Inspec
                       on suitT.Id equals inspec.IdSuitT

                   join listFinalDef in db.ListFinalDef
                       on inspec.Id equals listFinalDef.IdInspec
                   into myListFinalDef
                   from groupListFinalDef in myListFinalDef.DefaultIfEmpty()

                   join artefact1 in db.Artefact
                       on groupListFinalDef.Id equals artefact1.IdListFinalDef
                   into myArtefact1
                   from groupArtefact1 in myArtefact1.DefaultIfEmpty()

                   join artefact2 in db.Artefact
                       on inspec.Id equals artefact2.IdInspec
                   into myArtefact2
                   from groupArtefact2 in myArtefact2.DefaultIfEmpty()

                   join typeArtefact in db.TypeArtefact
                       on inspec.IdTypeArtefact equals typeArtefact.Id
                   where ...
                   select new ArtefactModels
                   {
                       IdArtefact1 = groupArtefact1.Id,
                       IdArtefact2 = groupArtefact2.Id,
                       ...,
                       ...,
                       ...
                   }).ToList();

发生了什么:复制行
示例

Id: 1 | ProjectName: Project 1 | InspecTitle: Title 1
Id: 1 | ProjectName: Project 1 | InspecTitle: Title 1
Id: 2 | ProjectName: Project 2 | InspecTitle: Title 2
Id: 2 | ProjectName: Project 2 | InspecTitle: Title 2

我正在尝试做的事情:
示例

Id: 1 | ProjectName: Project 1 | InspecTitle: Title 1
Id: 2 | ProjectName: Project 2 | InspecTitle: Title 2

已编辑:
我正在尝试使用 LINQ 表达式执行此 SQL:

SELECT art1.Id AS IdArtefact1, art2.Id AS IdArtefact2, ...
FROM
Project 
INNER JOIN SuitT ON Project.Id = SuitT.IdProject
INNER JOIN Inspec ON SuitT.Id = Inspec.IdSuitT
LEFT JOIN ListFinalDef ON Inspec.Id = ListFinalDef.IdInspec
LEFT JOIN Artefact AS art1 ON ListFinalDef.Id = art1.IdListFinalDef
LEFT JOIN Artefact AS art2 ON Inspec.Id = art2.IdInspec
INNER JOIN TypeArtefact ON Inspec.IdTypeArtefact = TypeArtefact.Id
WHERE ...

【问题讨论】:

  • 你想用 linq 写什么 sql 查询?
  • 如果你的数据模型是正确的,你就不应该有那么复杂的Linq查询
  • 简短的回答是使用 Select(your propreties).Distinct().ToList()。但从您的查询来看,您的设计存在一些问题。
  • 对于您需要的简单结果,您的查询似乎非常困难。你能复制你的模型吗? (在结果上调用 Distinct() 是最简单的,但这当然是一个非常糟糕的解决方案:p)
  • 使用 linq distinct 函数。

标签: c# sql-server entity-framework asp.net-mvc-5 linq-expressions


【解决方案1】:

groupby 是这样的:

var sql = (from project in db.Project
               join suitT in db.SuitT
                   on project.Id equals suitT.IdProject

               join inspec in db.Inspec
                   on suitT.Id equals inspec.IdSuitT

               join listFinalDef in db.ListFinalDef
                   on inspec.Id equals listFinalDef.IdInspec
               into myListFinalDef
               from groupListFinalDef in myListFinalDef.DefaultIfEmpty()

               join artefact1 in db.Artefact
                   on groupListFinalDef.Id equals artefact1.IdListFinalDef
               into myArtefact1
               from groupArtefact1 in myArtefact1.DefaultIfEmpty()

               join artefact2 in db.Artefato
                   on inspec.Id equals artefact2.IdInspec
               into myArtefact2
               from groupArtefact2 in myArtefact2.DefaultIfEmpty()

               join typeArtefact in db.TypeArtefact
                   on inspec.IdTypeArtefact equals typeArtefact.Id
               where ...
               select new ArtefactModels
               {
                   IdArtefact1 = groupArtefact1.Id,
                   IdArtefact2 = groupArtefact2.Id,
                   ...,
                   ...,
                   ...
               })
               //This will return IGroupable<key,value> with as key IdArtefact and as 
               //value an Enumerable of all the anonymous types with the same IdArtefact
               .GroupBy(a => a.IdArtefact1)
               //Select first value per IdArtefact if there's multiple
               .Select(a => a.FirstOrDefault())
               .ToList();

【讨论】:

  • 顺便看看这个答案,我认为它解释了为什么你会得到重复,那么你根本不需要这个 GroupBy 解决方法。 stackoverflow.com/a/3855926/3410196
  • 非常感谢!工作完美!嗯……有趣!我尝试过使用 IdArtefact1 和 IdArtefact2。仅与 IdArtefact2 合作,我不知道为什么。你?是否可以使用此方法将更多字段分组?
  • 很高兴它为你解决了,是的,你可以使用这样的匿名类型:.GroupBy(a =&gt; new { a.IdArtefact1, a.IdArtefact2 })
【解决方案2】:

你可以使用我的图书馆PowerfulExtensions。它有一个Distinct by properties 方法记录here

只需在 LINQ 链的末尾调用它并传递使行与众不同的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多