Linq с условными объединениями - PullRequest
0 голосов
/ 10 ноября 2011

Я не смог преобразовать следующий SQL-запрос левого соединения в linq:

select  Students.StudentID, StudentAddresses.state
from Students left join Studentaddresses on (Students.StudentID = Studentaddresses.StudentID and StudentAddresses.Active=1)
where (StudentAddresses.Rank =1  or StudentAddresses.StudentID is null)
and Students.StudentID =3

Студент может иметь нулевую запись или несколько записей в таблице адресов учеников, но только одна из записей может быть активной иОценка = 1.

Мне удалось выполнить левое соединение в linq и заставить его работать в обычной ситуации.Но если у ученика есть две неактивные записи в таблице учеников, я не знаю, как сделать так, чтобы записи ученика появлялись только один раз в конечном результате.Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2011

Это будет оператор SQL, преобразованный в linq:

var q = from student in Students
        from adress in Studentaddresses.Where(x => student.StudentID == x.StudentID && x.Active).DefaultIfEmpty()
        where (adress.Rank == 1 || adress.StudentID == null) && student.StudentID == 3
        select new                          
        {
           StudentID = student.StudentID,
           State = adress.state
        };
0 голосов
/ 10 ноября 2011

Используйте Distinct(), чтобы свернуть дубликаты.

var LeftJoin = (from student in Students
                join address in (from address1 in StudentAddresses where address.Active select address1) 
                on student.StudentID equals address.StudentId
                into JoinedStudentAddress
                from joined in JoinedStudentAddress.DefaultIfEmpty()
                select new                          
                {
                    StudentID = student.StudentID,
                    State = joined != null ? joined.State : null
                }).Distinct();

Альтернативный синтаксис

 var LeftJoin = Students.GroupJoin( StudentAddress.Where( a => a.Active ),
                                    s => s.StudentID,
                                    a => a.StudentID,
                                    (s,a) => new { Student = s, Addresses = a } )
                        .SelectMany( j = > j.Addresses.DefaultIfEmpty()
                                     (s,a) => new {
                                                 StudentID = s.Student.StudentID,
                                                 State = a != null ? a.State : null
                                    })
                        .Distinct();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...