2013-12-11 122 views
0

我已經形成了以下LINQ查詢,但.. .. 。 。如何編寫LINQ連接多條件

如果您有第三次加入...在這種情況下condional ...如何寫這個?

例如:

var query = from trip in db.Trips 
from driver in db.Drivers 
condition1 ? join X in other_table : join Y in other_table2 
where trip.DriverId == driver.DriverId || 
     trip.CoDriverId == driver.DriverId 
select new { driver.DriverId, trip.TripId }; 
+0

你考慮基於條件建設2個不同的查詢,反對試圖動態組裝它 – Konstantin

+0

我建議建立在數據庫級和查詢相應的視圖它通過LINQ。 –

+0

你可以在所有其他表格上進行左連接,然後與它們一起操作 –

回答

2

如果在相同的,那麼最簡單的方式做到這一點的other_tableother_table2類型是:

IQueryable<SomeType> joinTable = condition1 ? other_table : other_table2; 

然後用join j in joinTable作爲查詢的一部分。

否則,如果只使用加入限制WHERE條件,而不是影響到田間地頭,你可以先寫query忽略,然後添加類似:

if(condition1) 
    query = query.Where(q => other_table.Where(o => foo==bar).Select(o => o.DriverId).Contains(q.DriverId)); 
else 
    query = query.Where(q => other_table.Select(o => o.DriverId).Contains(q.DriverId)); 

這裏的限制foo==bar是爲了表明我們可以在必要時爲這些更進一步的Where子句添加相當多的細節。最主要的是Where不會改變結果的類型; query對於某些TIQueryable<T>,並且在Where之後仍然如此,因此我們可以將該查詢分配回query

如果連接是增加值,那麼:

var newQuery = condition1 
    ? query.Join(other_table, q=>DriverId, ot => ot.DriverId, (q, ot) => new {q.DriverID, q.TripId, ot.OtherField} 
    : query.Join(other_table2, q=>DriverId, ot => ot.DriverId, (q, ot) => new {q.DriverId, q.TripId, OtherField = ot.YetAnotherField}; 

注意other_table.OtherFieldot.YetAnotherField必須是同一類型的。這取決於編譯器創建與同一類具有相同名稱,順序和字段類型的匿名類,因此可以推導出newQuery的類型(並且對於每個分支都是相同的)。如果它們不是同一類型,那麼你需要或者投一個其他的類型,否則這樣做:

var newQuery = condition1 
    ? query.Join(other_table, q=>DriverId, ot => ot.DriverId, (q, ot) => new {q.DriverID, q.TripId, ot.OtherField, YetAnotherField = (string)null} 
    : query.Join(other_table2, q=>DriverId, ot => ot.DriverId, (q, ot) => new {q.DriverId, q.TripId, OtherField = -1, ot.YetAnotherField}; 

在這最後一個例子,OtherField是被設置爲-1如果condition1整數如果condition1爲假,則YetAnotherField是設置爲null的字符串。

0

如果我理解的核心問題,所以:

var query = from trip in db.Trips 
      from driver in (condition1 ? cdb.Drivers1 : cdb.Drivers2) 
      where trip.DriverId == driver.DriverId || 
      trip.CoDriverId == driver.DriverId 
      select new { driver.DriverId, trip.TripId }; 
+0

如果兩個源是相同類型的,它就會工作 –

+0

這是真的(他似乎也使用TypedDataSet,當然它也是不同的類型) 。你的回答是正確的。另一個建議:有時候你應該在數據庫級別(在DataAdapter中)使用UNION連接表。 – dovid