【发布时间】:2009-05-10 19:24:29
【问题描述】:
我从一段时间以来一直在尝试使用 LINQ。 枚举集合并在我的代码中更改其某些属性的典型方法如下所示:
ATDataContext dc = new ATDataContext(Settings.connection_string);
int[] col = ListViewClass.getListViewSelectedPositionTags(listView);
try
{
foreach (var item in col)
{
var ctx = (from r in dc.MailingLists
where r.ID == item
select r).Single();
ctx.Excluded = 'Y';
ctx.ExcludedComments = reason;
}
dc.SubmitChanges();
}
有些时候有人建议通过……来做这件事,这似乎是更聪明的方法:
var ctx = from r in dc.MailingLists
where col.Contains(r.ID)
select r;
foreach (var item in ctx)
{
item.Excluded = 'Y';
item.ExcludedComments = reason;
}
dc.SubmitChanges();
它在很多层面上都很有意义,我喜欢这个解决方案。它比第一个更智能、更快。
我在生产环境中使用该解决方案已有一段时间了。
几周后搜索应用程序日志文件并看到以下内容时,我感到很惊讶:
“传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。此 RCP 请求中提供的参数过多。最大值为 2100。”
LINQ to SQL 将 where col.Contains(r.ID) 转换为 INclause 看起来像:
ID 在哪里(@p1、@p1、@p2 ...)
col 集合达到(在我的情况下)超过 2100 个元素并且查询无法执行。我对这个问题做了一些研究,结果是:
“... sql 查询中的最大参数数为 2100。还有更多限制,例如整个查询字符串不能超过 8044 个字符。”
我非常喜欢第二种解决方案。我对 SQL Server 的这些硬编码限制感到非常失望。
我错过了什么吗? 我可以做些什么来使用“where col.Contains(r.ID)”版本吗?
问候 马吕斯
ps。 (我使用 Win XP、C# 和 LINQ 和 SQL 2005 Express)。
【问题讨论】:
-
道歉。我没有设法格式化代码示例。如果有人可以提供帮助,我将不胜感激......
-
格式化;您可以在编辑器中使用“代码”和“引用”按钮来执行此操作。
-
I have loved the second solution so much: "爱过又失去,总比从来没有爱过要好"
标签: c# linq-to-sql