SQL Server 單一 RPC 批次最多 2100 參數。LINQ to SQL 將 list.Contains(id) 轉譯為 IN (@p0, @p1, ...),ID 過多即拋出異常。
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 參數限制。
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 子查詢,完全避開參數數量限制。