【问题标题】:LinqToSQL joining local list to table - confusionLinq To SQL 将本地列表加入表 - 混淆
【发布时间】: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


【解决方案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 进行过滤。类似于context.CargoProducts.AsEnumerable()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2017-12-25
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多