2013-12-22 3 views
5

У меня есть SQL-запрос, похожий на Lambda Expressions, как правило, с большим количеством объединений, чем в этом примере.Множественное левое внешнее соединение с лямбда-выражениями

select Table2.a, 
      Table2.b, 
      Table2.c, 
      Table2.d 
    from Table1 
    LEFT OUTER JOIN Table2 
    ON Table2.a = Table1.a and 
     Table2.b = Table1.b and 
     Table2.c = Table1.c 
    LEFT OUTER JOIN Table3 
    ON Table3.b = Table1.b AND 
     Table3.c = Table1.c AND 
     Table3.d = Table1.d 
    where (Table1.a = ValueA) 
    order by Table3.f 

Я делаю это с Join() лямбда-выражение, но я вижу в профилировщике SQL Server, что генерировать INNER JOIN и я нужен LEFT OUTER JOIN.

Это, как я делаю это с помощью функции присоединения()

var RS = DBContext.Table1.Join(DBContext.Table2, 
    Table1 => new {Table1.a, Table1.b, Table1.c}, 
    Table2 => new {Table1.a, Table1.b, Table1.c}, 
    (Table1, Table2) => new {Table1}) 
.Join(DBContext.Table3, 
    LastJoin => new {LastJoin.Table1.b, LastJoin.Table1.c, LastJoin.Table1.d}, 
    Table3 => new {Table3.b, Table3.c, Table3.d}, 
    (LastJoin,Table3) => new {LastJoin.Table1, Table3}) 
.Where (LastTable => LastTable.Table1.a == ValueA) 
.OrderBy(LastTable => LastTable.Table3.f) 
.Select (LastTable => new {LastTable.Table1, LastTable.Table3}); 

Я читал, что это может быть сделано с DefaultIfEmpty() или GroupJoin(), но я не найти какой-либо сложный пример с более одного ВЛЕВОГО ВЗАИМОДЕЙСТВИЯ.

+0

Можете ли вы показать, какие свойства навигации у вас есть? Это намного проще, если вы можете использовать синтаксис типа 'orderby table1.Table3.f'. –

+0

Здравствуйте, мое выражение lambda dos не указывает его, потому что я хочу, чтобы все поля сущностей были причиной выбора в конце выражения лямбда. – JuanDYB

+0

Так как вы знаете, как написать запрос с левым соединением, почему бы прямо не вызвать его или не поместить в хранимый процесс и назвать его? – HLGEM

ответ

3

Почему вы не пытаетесь использовать запрос linq, также намного проще писать и понимать как по сравнению с лямбда-выражениями. У меня есть такая реализация, как:

var products = 
     from p in this.Products 
     from cat in this.ProductCategoryProducts 
     .Where(c => c.ProductID == p.ProductID).DefaultIfEmpty() 

     from pc in this.ProductCategories 
     .Where(pc => ac.ProductCategoryID == cat.ProductCategoryID).DefaultIfEmpty() 

     where p.ProductID == productID 
     select new 
     { 
      ProductID = p.ProductID, 
      Heading = p.Heading,     
      Category = pc.ProductCategory 
     }; 
    return products ; 
Смежные вопросы