首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

LINQ to SQL 動態構建 Where 條件:列表主鍵包含查詢

     編輯:程式設計綜合問答

場景

根據傳入的條件列表 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();
    }
}

關鍵技術點

  1. AsEnumerable():將查詢從 IQueryable(SQL 端)轉為 IEnumerable(內存端),使 Contains 能直接操作內存集合,避免生成巨大的 IN (..., ...) SQL 或參數數量超限。
  2. 預先 ToList():keys 必須在內存中實例化,否則 Contains 會嘗試轉譯為 SQL 子查詢,可能不支持或效率低。
  3. 性能權衡:若主查詢結果集極大,先在 SQL 端過濾(用 join 或 WHERE EXISTS)更優。可根據條件列表大小動態選擇策略。

進階:構建表達式樹動態 Where(保持 IQueryable)


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 參數)且需保持數據庫端過濾的場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved