2013-10-04 32 views
1

我正在开发一个使用LinqToSQL的应用程序。作为这个的一部分,我创建了一个整数列表,它们表示我想要筛选的键。在过去的每一次当我这样做,并想加入我的列表和数据表我得到以下错误:LinqToSQL将本地列表连接到表 - 混淆

Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator

现在,这是很好的,因为,我的理解是,这是一个limitaiton/LinqToSQl的功能。我一直在使用如图所示,包含了我的查询操作:

List<CargoProduct> cargoProducts = context.CargoProducts 
            .Where(cp => cargos.Contains(cp.CargoID)) 
            .ToList(); 

最近,我遇到了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(); 

有趣的功能,我想我明白为什么它是做什么ð OES。可能是一个很好的解决方法,而不是使用包含较小数据集的包含。

+0

那么,它允许你这样做的原因是因为你实际上并没有传入值,它查询并返回整个表,然后从c#过滤它,而不是在SQL中过滤它。打开SQL分析器,看看它传递了什么〜_〜) – Ricc

回答

1

在这个查询

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

在联接语句左操作数IEnumerable类型的,则该Enumerable.Join扩展方法被选择在方法重载分辨率。这意味着整个CargoProducts表正被加载到内存中,并通过Linq To Objects进行过滤。它与context.CargoProducts.AsEnumerable()类似。