如果在相同的,那麼最簡單的方式做到這一點的other_table
和other_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
對於某些T
是IQueryable<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.OtherField
和ot.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
的字符串。
你考慮基於條件建設2個不同的查詢,反對試圖動態組裝它 – Konstantin
我建議建立在數據庫級和查詢相應的視圖它通過LINQ。 –
你可以在所有其他表格上進行左連接,然後與它們一起操作 –