2013-11-27 2 views
2

Как я могу присоединиться к двум различным таблицам на основе условия?LINQ JOIN различные таблицы на основе условий

У меня есть запрос, как в:

var myquery = from p in db.tbl1 
       join q in db.tbl2 on p.field1 equals q.field1 
       join r in db.tbl3 on q.field2 equals r.field2 

До здесь все в порядке, теперь я хочу добавить еще 1 присоединиться к столу, но она должна быть основана на состоянии, как:

if(q.field3 == 1) 
    join s in db.tbl4 on q.field4 equals s.field4 
else if(q.field3 == 2) 
    join s in db.tbl5 on .... 

Так что в основном я хочу присоединиться к различным таблицам на основе значения q.field3.

+0

Можете ли вы предоставить фактические данные и фактические «полные» запросы? Попытка изменить форму на основе данных * в * запрос звучит очень .. подозрительно. (Хотя это может быть так же просто, как выполнить агрегатное объединение и фильтрацию/выбор нужных столбцов.) – user2864740

+0

Является ли '' 'того же типа в обеих таблицах? Как вы планируете посмотреть остальную часть запроса, если это не так? –

ответ

2

Вы не сможете условно присоединиться к значению одной строки. Идея присоединения состоит в том, что вы соединяетесь на основе всех строк. Условное определение того, что/как присоединиться на основе некоторого значения вне запроса, будет иметь смысл.

Что вы может do делает оба соединения безоговорочно, но выбирайте, какой результат использовать условно для каждой строки. Очевидно, что это будет работать только в том случае, если таблицы того же типа, или если вы первый проект s1 и s2 в общий тип (используя let)

var myquery = from p in db.tbl1 
    join q in db.tbl2 on p.field1 equals q.field1 
    join r in db.tbl3 on q.field2 equals r.field2 
    join s1 in db.tbl4 on q.field4 equals s1.field4 
    join s2 in db.tbl5 on q.field5 equals s2.field5 
    let s = q.field3 == 1 ? s1 : 
      q.field3 == 2 ? s2 : null 

Этот должен быть в состоянии быть переведен поставщиком запросов в оператор CASE.

Смежные вопросы