1

我正在使用 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();

这是一个有趣的功能,我想我理解它为什么会这样做。可能是一个很好的解决方法,而不是对较小的数据集使用包含。

4

1 回答 1

1

在这个查询中

List<CargoProduct> results = (from c in cargos
                         join cp in context.CargoProducts on c equals cp.CargoID
                         select cp).ToList();

join 语句中的左操作数是 type IEnumerable,然后Enumerable.Join在方法重载决议上选择扩展方法。这意味着整个 CargoProducts 表正在加载到内存中,并通过 Linq To Objects 进行过滤。它与做类似context.CargoProducts.AsEnumerable()

于 2013-10-04T13:49:29.250 回答