根據傳入的條件列表 List<Condition> conditions 動態過濾主查詢。
public List<Entity> Query(List<Condition> conditions) {
using (var db = new DataContext()) {
var query = from p in db.TableA
join c in db.TableB on p.Id equals c.Id into gj
from sub in gj.DefaultIfEmpty()
select p;
// 提取條件列表中的主鍵集合
var keys = conditions.Select(c => c.Key).ToList();
// 動態 Where:主鍵在列表中
return query.AsEnumerable() // 切換到 LINQ to Objects
.Where(x => keys.Contains(x.Key))
.ToList();
}
}
IQueryable(SQL 端)轉為 IEnumerable(內存端),使 Contains 能直接操作內存集合,避免生成巨大的 IN (..., ...) SQL 或參數數量超限。keys 必須在內存中實例化,否則 Contains 會嘗試轉譯為 SQL 子查詢,可能不支持或效率低。join 或 WHERE EXISTS)更優。可根據條件列表大小動態選擇策略。
var param = Expression.Parameter(typeof(Entity), "x");
var prop = Expression.Property(param, "Key");
var constKeys = Expression.Constant(keys);
var containsMethod = typeof(List<int>).GetMethod("Contains", new[] { typeof(int) });
var call = Expression.Call(constKeys, containsMethod, prop);
var lambda = Expression.Lambda<Func<Entity, bool>>(call, param);
return query.Where(lambda).ToList(); // 生成 SQL WHERE Key IN (...)
適用於條件列表較小(<2000 參數)且需保持數據庫端過濾的場景。