C# - 从 SQL 到 Linq - 左外连接/内连接

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

我在 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();
}

感谢您的帮助,可能有点困惑。因为我改变了变量名。 顺便说一句,抱歉英语不好

最佳答案

根据MSDN :

To perform a left outer join in LINQ, use the DefaultIfEmpty method in combination with a group join to specify a default right-side element to produce if a left-side element has no matches. You can use null as the default value for any reference type, or you can specify a user-defined default type.

据我所知,您首先通过 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();
    }

关于C# - 从 SQL 到 Linq - 左外连接/内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43758567/

相关文章:

c# - 从另一个 C# 程序捕获 c# 可执行输出

c# - MSBuild maxcpucount > 1 导致生成错误

MySQL:在日期时间记录之间选择

c# - 使用 FUNC 方法(选择器)返回我列表的 "light version"

c# - 递归调用比较对象属性

c# - 如何返回 IQueryable<T> 以供进一步查询

c# - 我如何检测用户何时单击我的 slider 而不是统一滑动?

mysql - phpMyAdmin 中的正则表达式搜索

MySQL MIN() 函数只返回一条记录

c# - 搜索字典的值