【问题标题】:C# - from SQL to Linq - Left Outer Join/Inner JoinC# - 从 SQL 到 Linq - 左外连接/内连接
【发布时间】:2017-10-01 04:45:00
【问题描述】:

我在 SQL 中得到了这个:

具有 3 个值:value1、value2、value3

SELECT A.a, A.b, E.c, B.d, A.e, A.f, A.g, D.h, D.i 

FROM Alpha as A 

INNER JOIN Beta as B ON A.b = B.k 

LEFT OUTER JOIN Charlie as C ON C.a = A.a  

LEFT OUTER JOIN Delta as D ON D.k = B.j  

INNER JOIN Echo as E ON A.a = E.a     

WHERE A.a = @value1 AND E.c = @value2 AND (A.a = @value3 OR @value3 = '') AND A.b = E.b

Alpha、Beta、Charlie、Delta 和 Echo 有字符串 a,b,c,d,e,f,g,h,i,j,k。

我已尝试转换为 Linq,但我没有正确理解 join 的语法。你能告诉我它应该是什么样子吗? x)

public static List<value> GetSmthn(string value1, string value2, string value3)
{           

    return (
         from A in Alpha

         join B in Beta on A.b equals B.k

         join C in Charlie on A.a equals C.a 

         join D in Delta on B.j equals D.k 

         join E in Echo on E.a equals A.a

         where (A.a == value1 && E.c == value2 && (A.a == value3 || value3 == "") && A.b == E.b)

         select new value() { a = A.a, b = A.b, c = E.c, d = A.d, e = A.e, f = A.f, g = A.g, h = D.h i = D.i }

         ).ToList();
}

感谢您的帮助,也许这有点令人困惑。因为我更改了变量名。 对不起,英语不好顺便说一句

【问题讨论】:

  • 您可能需要查看this MSDN 以了解 linq 中的左连接。看来您必须使用群组加入并使用 DefaultIfEmpty
  • 您应该检查 DefaultIfEmpty 选项并加入。检查下面的链接以获取有关联接的更多信息。 msdn.microsoft.com/en-us/library/bb311040.aspx
  • 这就是问题所在,我在 MDSN 上没有得到它。我不知道为什么,我无法理解,所以我寻求帮助:D
  • 它在 MSDN 上,检查我提供的链接并通过左外连接部分。
  • 我知道理论,但我不知道如何在我的代码中使用它。

标签: c# sql linq left-join inner-join


【解决方案1】:

根据MSDN

要在 LINQ 中执行左外连接,请将 DefaultIfEmpty 方法与组连接结合使用,以指定在左侧元素没有匹配项时生成的默认右侧元素。您可以使用 null 作为任何引用类型的默认值,也可以指定用户定义的默认类型。

据我所知,您首先通过GroupJoin 连接所有数据,这“根据键相等关联两个序列的元素并对结果进行分组”。然后,下面的from 指定一个默认的右侧元素(通过使用DefaultIfEmpty())来生成左侧元素是否没有匹配项。您需要对所有左连接执行此操作:

public static List<value> GetSmthn(string value1, string value2, string value3)
    {           

    return (
         from A in Alpha

         join B in Beta on A.b equals B.k

         join C in Charlie on A.a equals C.a into cgroup
         from C in cgroup.DefaultIfEmpty()

         join D in Delta on B.j equals D.k into dgroup
         from D in dgroup.DefaultIfEmpty()

         join E in Echo on E.a equals A.a

         where (A.a == value1 && E.c == value2 && (A.a == value3 || value3 == "") && A.b == E.b)

         select new value() { a = A.a, b = A.b, c = E.c, d = A.d, e = A.e, f = A.f, g = A.g, h = D.h i = D.i }

         ).ToList();
    }

【讨论】:

  • 为什么在 charlie 和 delta a from 之后,而在 echo 之后没有?
  • 啊好的我明白了xD
  • 在 Internet-Pages 上始终是“新产品 { Name = String.Empty, CategoryID = 0 }”或类似的东西,在 DefaultIsEmpty() 内部为什么我们不需要它?
  • @R.Lorch 我正在关注您在问题中提供的内容。我也没有看到您在我的链接中提到的示例。
  • “来自 prodGroup.DefaultIfEmpty(new Product { Name = String.Empty, CategoryID = 0 }) 中的项目”msdn.microsoft.com/en-us/library/bb311040.aspx
猜你喜欢
  • 1970-01-01
  • 2011-10-14
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 2011-08-10
相关资源
最近更新 更多