Конвертировать обычный SQL в LINQ для сущностей - PullRequest
1 голос
/ 31 мая 2011

После долгих поисков я не могу найти простой ответ на следующий оператор 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

Из-за двойного оператора ON я не знаю, как написать его в LINQ.

Я пытался упростить его, но несколько первичных ключей усложняют работу.

Ответы [ 3 ]

2 голосов
/ 31 мая 2011

Начните с перевода запроса SQL на более естественный. Как это:

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 t1.Id_Mandants = t2.Id_Mandants
WHERE   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 };

кстати. Почему вы выводите оба значения LoginData.LoginName как USR02.BNAME, поскольку они всегда равны?

0 голосов
/ 31 мая 2011

Мне нравится писать соединения таким образом

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 };
0 голосов
/ 31 мая 2011

Вам нужно преобразовать запрос в обычное одноуровневое соединение:

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 to Entities:

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 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...