【发布时间】:2013-10-04 13:05:00
【问题描述】:
我正在使用 LinqToSQL 开发应用程序。作为其中的一部分,我创建了一个整数列表,它代表我想要过滤的键。过去每次我这样做并尝试加入我的列表和数据表时,都会收到以下错误:
除了 Contains() 运算符外,查询运算符的 LINQ to SQL 实现中不能使用本地序列
现在这很好,因为据我了解,这是 LinqToSQl 的限制/功能。我一直在为我的查询使用 Contains 运算符,如下所示:
List<CargoProduct> cargoProducts = context.CargoProducts
.Where(cp => cargos.Contains(cp.CargoID))
.ToList();
最近我在 Contains 中遇到了 2100 个项目的限制,所以一直在寻找其他方法来做到这一点,最终得出以下结论:
List<CargoProduct> cargoProducts = context.CargoProducts.AsEnumerable()
.Join(cargos, cp => cp.CargoID, c => c, (cp, c) => cp)
.ToList();
现在,这很好用,所以我为其他开发人员整理了一封知识共享电子邮件,以防他们遇到此限制。我试图获取错误消息,所以将另一个查询放在一起,而不是我预期的失败:
List<CargoProduct> results = (from c in cargos
join cp in context.CargoProducts on c equals cp.CargoID
select cp).ToList();
令我惊讶的是,这不仅没有引发错误,而且返回的结果与之前的查询完全相同。那么,我在这里缺少什么?我敢肯定这是显而易见的!
作为参考上下文是我的 LinqToSQl 连接,cargos 被实例化为:
List<int> cargos = context.Cargos.Select(c => c.CargoID).ToList();
更新
正如回复中提到的,它确实似乎是我加入东西的顺序,好像我使用以下内容然后我得到预期的错误消息:
List<CargoProduct> test3 = (from cp in context.CargoProducts
join c in cargos on cp.CargoID equals c
select cp).ToList();
这是一个有趣的功能,我想我理解它为什么会这样做。对于较小的数据集,而不是使用 Contains 可能是一个很好的解决方法。
【问题讨论】:
-
好吧,它允许你这样做的原因是因为你实际上并没有传入值,它查询并返回整个表,然后从 c# 中过滤它,而不是在 SQL 中过滤它。打开 SQL 探查器,看看它传递了什么 ~_~)
标签: c# linq linq-to-sql