Linq Left Outer соединяет два стола на двух полях

Как мне оставить внешнее соединение двух таблиц на двух полях в linq? У меня есть sql:

    select a.*, b.* from courselist as a
                                 left outer join  Summary as b
                                 on a.subject = b.Subject and a.catalog = 
    b.Catalogno 
                                 where a.degree_id = 1 
                                 order by a.sequenceNo

Ниже приведен мой запрос linq, но есть ошибка, подчеркивающая "join", которая не удалась при вызове "Groupjoin". Я не знаю, как это исправить.

    var searchResults = (from a in db.courselist
                                   join b in db.Summary on
                                  new { a.subject,a.catalog } equals
                                   new { b.Subject, b.Catalogno } into ab

                                  where  a.degree_id == 1 
                                  orderby a.degree_sequenceNo
                                  from b  in ab.DefaultIfEmpty()
                                  select new
                                  {
                                      Courselist = a,
                                      Summary = b
                                  }
                                ).ToList();

Благодарю.

3 ответа

Решение

Я снова проверил ваш код и обнаружил, что это ошибка, вам просто нужно указать имя параметров соединения следующим образом:

new { suject = a.subject, catalog = a.catalog } equals
new { suject = b.subject, catalog = b.Catalogno } into ab

Основная проблема, когда люди начинают использовать LINQ, заключается в том, что они продолжают думать по-SQL, сначала они проектируют запрос SQL, а затем переводят его в LINQ. Вам нужно научиться мыслить в стиле LINQ, и ваш запрос LINQ станет точнее и проще. Например, в вашем LINQ вам не нужны объединения. Вы должны использовать Ассоциации / Свойства навигации вместо этого. Проверьте этот пост для более подробной информации.

Должны быть отношения между courselist а также Summaryв этом случае вы можете получить доступ Summary через courselist как это:

var searchResults = (from a in db.courselist
                     where  a.degree_id == 1 
                     orderby a.degree_sequenceNo
                     select new {
                         Courselist = a,
                         Summary = a.Summary
                     }).ToList();

Если между ними нет никакой связи, вам следует пересмотреть свой дизайн.

Кажется, вы пропустили ссылку, в запросе нет ошибки, попробуйте использовать это:

using System.Linq;
Другие вопросы по тегам