首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ Contains 參數超過 2100 限制的替代方案

     編輯:關於.NET

錯誤成因

SQL Server 單一 RPC 批次最多 2100 參數。LINQ to SQL 將 list.Contains(id) 轉譯為 IN (@p0, @p1, ...),ID 過多即拋出異常。

方案一:原始 SQL + Translate(適用任意大小清單)

public static List<T> QueryByIds<T>(int[] ids) where T : class
{
    using (var dc = new DataClasses1DataContext())
    {
        var sb = new StringBuilder($"SELECT * FROM {typeof(T).Name} WHERE testid IN (");
        for (int i = 0; i < ids.Length; i++)
        {
            sb.Append(ids[i]);
            if (i < ids.Length - 1) sb.Append(",");
        }
        sb.Append(")");

        var cmd = dc.Connection.CreateCommand();
        cmd.CommandText = sb.ToString();
        dc.Connection.Open();
        using (var reader = cmd.ExecuteReader())
            return dc.Translate<T>(reader).ToList();
    }
}

利用 DataContext.Translate 將 SqlDataReader 物質化為實體,繞過 LINQ 參數限制。

方案二:子查詢(ID 來源為 IQueryable)

var allowedIds = dc.Test.Select(x => x.TestId); // IQueryable
var logs = dc.Log.Where(l => allowedIds.Contains(l.LogId));
// 產生 SQL: WHERE EXISTS (SELECT ... FROM Test WHERE TestId = LogId)

若 ID 清單本身來自資料庫查詢,直接串接 Contains 會產生 EXISTS 子查詢,完全避開參數數量限制。

選擇建議

  • ID 為記憶體中陣列/清單且 > 2100:使用方案一(動態 SQL)。
  • ID 來源為另一張表或可組合查詢:優先方案二(子查詢),效能最佳且型別安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved