我正在使用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用于较小的数据集。
答案 0 :(得分:1)
在此查询中
List<CargoProduct> results = (from c in cargos
join cp in context.CargoProducts on c equals cp.CargoID
select cp).ToList();
join语句中的左操作数是IEnumerable
类型,然后在方法重载决策上选择Enumerable.Join
扩展方法。这意味着整个CargoProducts表正在内存中加载并通过Linq To Objects进行过滤。它与do context.CargoProducts.AsEnumerable()
类似。