2010-08-23 7 views
15

Я борюсь с предложением join/where с довольно простым оператором select sql.LINQ Join Where Where

Я пытаюсь получить список информации о продукте из tb1 с условием, расположенным в tbl2, но к этому нужно добавить три разных столбца.

поэтому SQL будет выглядеть примерно вдоль линий:

SELECT  tb1.* 
FROM   tb2 INNER JOIN 
         tb1 ON tb2.Col1 = tb1. Col1 AND tb2.Col2 = tb1. Col2 AND 
         tb2.Col3 = tb1.Col3 
WHERE  (tb2.Col1 = col1) AND (tb2.Col2 = col2) AND (tb2.Col4 = string) 

ColX является основным, где положение со строкой будет принят в качестве параметра; все остальные столбцы находятся в контексте.

Как реализовать несколько объединений с предложением where?

И стреляет в правильном направлении, очень ценится.

ответ

42

Чтобы присоединиться на нескольких местах в LINQ, вы должны создать новый анонимный тип, содержащий столбцы, которые вы хотите сравнить, а затем использовать этот анонимный тип в соединении:

var results = from t1 in context.tb1 
       join t2 in context.tb2 
       on new { t1.Col1, t1.Col2, t1.Col3 } equals 
        new { t2.Col1, t2.Col2, t2.Col3 } 
       where t2.Col1 == col1 && t2.Col2 == col2 && t2.Col4 == someString 
       select t1; 

А вот эквивалентном Lambda синтаксис:

var results = context.tb1.Join(
        context.tb2, 
        t1 => new { t1.Col1, t1.Col2, t1.Col3 }, 
        t2 => new { t2.Col1, t2.Col2, t2.Col3 }, 
        (t1, t2) => new { t1, t2 }) 
       .Where(o => o.t2.Col1 == col1 
        && o.t2.Col2 == col2 
        && o.t2.Col4 == someString) 
       .Select(o => o.t1); 

Как вы можете видеть, в случае объединения, синтаксис запросов обычно приводит к более легким для чтения заявления.

+0

Легенда - спасибо Джастину. Я думаю, если бы я продолжал царапать еще три часа, пробная версия и ошибка заставили меня здесь! Большое спасибо. –

+0

Можно ли это сделать в структуре метода (свободные интерфейсы)? –

+1

@Maxim Zaslavsky - Вы имеете в виду использование синтаксиса Lambda? –

7

Вы также можете включить предложение WHERE в синтаксис lamda в ссылке на таблицу, в которую вы входите.

 var query = from pt in dc.ProjectTasks 
        join ttab in dc.TimeTaskAssigns on pt.Id equals ttab.ProjectTaskId 
        join ttb2 in dc.CMS_TAT_TIMEs.Where(a => a.WIP_STATUS == 'B') on ttab.CmsTimeUno equals ttb2.TIME_UNO 
        select pt; 

Кажется очевидным сейчас, не так ли? Мне понадобилось много времени, чтобы найти это решение.