C# 将常规SQL转换为LINQ转换为实体
经过大量搜索,我找不到以下SQL语句的简单答案:C# 将常规SQL转换为LINQ转换为实体,c#,sql,linq,entity-framework,linq-to-entities,C#,Sql,Linq,Entity Framework,Linq To Entities,经过大量搜索,我找不到以下SQL语句的简单答案: SELECT t1.LoginName, t0.BNAME FROM USR02 AS t0 LEFT OUTER JOIN LoginData AS t1 INNER JOIN Mandants AS t2 ON t1.Id_Mandants = t2.Id_Mandants ON t0.BNAME = t1.LoginName AND t0.MANDT = t2.CodeMandant 由于double-ON语句,我不知道如何用LI
SELECT t1.LoginName, t0.BNAME
FROM USR02 AS t0
LEFT OUTER JOIN LoginData AS t1
INNER JOIN Mandants AS t2 ON t1.Id_Mandants = t2.Id_Mandants
ON t0.BNAME = t1.LoginName AND t0.MANDT = t2.CodeMandant
由于double-ON语句,我不知道如何用LINQ编写它
我试图简化它,但多个主键使这项工作变得困难。您需要将查询转换为常规的一级联接:
select t1.LoginName, t0.BNAME
from USR02 as t0
left outer join LoginData as t1 on t0.BNAME = t1.LoginName
inner join Mandants as t2 on t0.MANDT = t2.CodeMandant and t1.Id_Mandants = t2.Id_Mandants
然后在LINQ上将其重写为实体会容易得多:
from t0 in db.t0
join t1 in db.t1 on t0.BNAME equals t1.LoginName
join t2 in db.t2 on new { t0.MANDT, t1.Id_Mandants} equals new { t2.CodeMandant , t2.Id_Mandants }
select new { t1.LoginName, t0.BNAME };
首先,将SQL查询转换为更自然的查询。像这样:
选择t1.LoginName,t0.BNAME
从USR02到t0
左侧外部连接登录数据为t1
在t0.BNAME=t1.LoginName上
内部连接命令作为t2
关于t1.Id\u命令=t2.Id\u命令
其中t0.MANDT=t2.CodeMandant
现在将其转换为LINQ应该很容易。正确设置实体模型中的关系后,您将能够编写以下LINQ查询:
from data in db.LoginData
where data.User.MANDT == data.Mandant.CodeMandant
select new { data.LoginName, data.User.BNAME };
顺便问一下,既然它们总是相等,为什么要将这两个
loginda.LoginName
输出为USR02.BNAME
?我喜欢这样写连接
from t0 in db.t0
from t1 in db.t1.Where(x => t0.BNAME == x.LoginName).DefaultIfEmpty()
from t2 in db.t2.Where(x => t0.MANDT == x.CodeMandant)
.Where(x => t1.Id_Mandants == x.Mandants)
select new { t1.LoginName, t0.BNAME };
到目前为止,您的方法是什么?旁白:您的
左连接
实际上表现为内部连接
嗨,丹尼尔,谢谢您的帮助。内部联接用于绑定T2表和t1,结果用于使左侧外部联接到T0,以查找所有无法映射到T0的LoginData行。但是我需要T0中的所有行。嗨,abatishchev,谢谢您的回答,一个重要的问题是我需要USR02表中的所有行,因此找到了所有为空的LoginData行。嗨,Steven,谢谢您的回答。我认为引起我麻烦的是“ON t0.BNAME=t1.LoginName和t0.MANDT=t2.CodeMandant”行,这很重要。