Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将常规SQL转换为LINQ转换为实体_C#_Sql_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

C# 将常规SQL转换为LINQ转换为实体

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

经过大量搜索,我找不到以下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语句,我不知道如何用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”行,这很重要。