2014-12-15 5 views
3

Как я могу выполнить SQL-запрос с Linq?Left Outer Присоединиться к сложным условиям

select DISTINC 
.... 
    from Table1 
    LEFT OUTER JOIN Table2 
    ON Table2.Field1 = Table1.Field1 AND 
     Table2.Field2 = Table1.Field2 AND 
     Table2.Field3 = Table1.Field3 AND 
     (
     (Table1.Field4 = 'Something' AND (Table2.Field5 = 'Something' 
           OR Table2.Field5 = 'Something')) 
     OR 
     (Table1.Field4 = 'Something' AND (Table2.Field5 = 'Something' 
           OR Table2.Field5 = 'Something')) 
     OR 
     (Table1.Field4 = 'Something' AND (Table2.Field5 = 'Something' 
           OR Table2.Field5 = 'Something' 
           OR Table2.Field5 = 'Something')) 
     ) 

    where 
    .... 
    order by ... 

Я делал LEFT OUTER JOINS в Linq, но только с равными, как этот

from Table1 in .... 
    join Table2 in .... 
    on new { Table1.Field1, Table1.Field2 } 
    equals new { Table2.UNField1V, Table2.Field2 } 
    into Join1 
    from Name in Join1.DefaultIfEmpty() 
    where 
    .... 
    select new { ... } 

Но я понятия не имею, чтобы сделать что-то подобное со сложными условиями, как SQL Query, которые я написал ,

+0

В отличие от сайтов форума, мы не используем «Спасибо», или «Любая помощь приветствуется», или подписи на [так]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed-from-posts). –

+0

@JuanDYB где находится таблица Dtos_Gra в предложении from? –

ответ

1
from t1 in Table1 
from t2 in Table2.Where(t2 => t2.Field1 == t1.Field1 && /* ... complex join condition */) 
       .DefaultIfEmpty() 
select new 
{ 
    t1.AnyReferenceField, 
    (int?)t2.AnotherInt32Field // ! 
    /* ... */ 
} 

Только не забудьте преобразовать значения полей t2 в значение NULL. В противном случае вы получите исключение, подобное The cast to value type 'System.Int32' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type..

Если вы хотите синтаксис запроса:

from t1 in Table1 
from t2 in (from t2 in Table2 
      where t2.Field1 == t1.Field1 && /* ... complex join condition */ 
      select t2).DefaultIfEmpty() 
select new { /* ... */ } 
+0

Привет: Спасибо за ваш ответ. Ваш пример помогает мне, и он работает хорошо. Также спасибо за вашу рекламу об объектах с нулевым значением. – JuanDYB