如果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 不会改变结果的类型;对于某些T,query 是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 是一个整数,如果condition1 为真,则设置为-1,而YetAnotherField 是一个字符串,如果condition1 为假,则设置为null。