LinqToSQL 将本地列表连接到表 - 混淆

本文关键字:混淆 连接 列表 LinqToSQL | 更新日期: 2023-09-27 18:33:51

我正在使用LinqToSQL开发一个应用程序。 作为其中的一部分,我创建了一个整数列表,这些整数表示我要过滤的键。 过去每次我这样做并尝试加入我的列表和数据表时,我都会收到以下错误:

本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains(( 运算符除外

现在这很好,因为据我了解,它是LinqToSQl的一个限制/功能。 我一直在使用包含运算符进行查询,如下所示:

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();

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

LinqToSQL 将本地列表连接到表 - 混淆

在此查询中

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 对象进行筛选。它类似于做context.CargoProducts.AsEnumerable()