我在 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/