我正在使用 LinqToSQL 开发应用程序。作为其中的一部分,我创建了一个整数列表,它代表我想要过滤的键。过去每次我这样做并尝试加入我的列表和数据表时,我都会收到以下错误:
本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains() 运算符除外
现在这很好,因为据我了解,这是 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 连接和货物被实例化为:
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();
这是一个有趣的功能,我想我理解它为什么会这样做。可能是一个很好的解决方法,而不是对较小的数据集使用包含。