如何在不使用foreach的情况下从集合中查询实体

时间:2012-05-23 22:22:46

标签: c# linq entity-framework

我一直在努力,并试图让我的思绪围绕着这些概念。任何帮助将不胜感激。给定一个表中的Orders集合,迭代它的最佳方法是什么,并对其他表执行查询。

这个循环做了我想要的,但我被告知并展示了它如何导致性能问题。在其他帖子中,我已经阅读了最好在循环外查询dbase的地方。

foreach (var item in myOrders)
{
var lookUpValues=(from f in ORDERS
where f.ORDERS ==item.ORDER_ID 
&& f.ORDERS_SUFFIX==item.LINE
select f.Something);
}

而不是在迭代之前拉下整个Order表我尝试过类似的东西,但是你看到它不会返回准确的行。

var orderIds=myOrders.Select (x =>x.ORDER_ID).Distinct().ToList();
var lineIds=myOrders.Select (x =>x.LINE).Distinct().ToList();

var query=(from f in ORDERS
where orderIds.Contains(f.ORDERS)
&& lineIds.Contains(f.ORDERS_SUFFIX)
select f).ToList();

以下会做我认为需要的事情。它将返回迭代所需的正确订单。但是,它会抛出一个错误,我认为这是因为你无法一起查询内存对象和实体。

var ordersAndLine=(from f in myOrders select new{sId=f.ORDER_ID,line=f.LINE}).ToList();

var query=(from f in ORDERS
from s in ordersAndLine
where s.sId==f.ORDERS
&& s.line==f.ORDERS_SUFFIX
select f).ToList();

NotSupportedException:无法创建“匿名类型”类型的常量值。在此上下文中仅支持原始类型(例如Int32,String和Guid')。

我真的希望我的问题有道理。如果我没有正确解释我的情况,我会提前道歉。我一直在做的是将大部分表拉到内存中进行迭代,但我担心这会导致性能问题,并希望看看是否有更好的方法来过滤结果查询。

3 个答案:

答案 0 :(得分:1)

如果你将第一次尝试和最后一次尝试结合起来,你就会拥有它。如果您没有创建匿名类型,那么最后一次尝试就没问题了。

var ordersAndLine=(from f in myOrders select f).ToList();

var query=(from f in ORDERS
from s in ordersAndLine
where s.ORDER_ID==f.ORDERS
&& s.LINE==f.ORDERS_SUFFIX
select f).ToList();

答案 1 :(得分:0)

答案 2 :(得分:0)

试试这个:

var orders = myOrders.SelectMany(item => (from f in ORDERS
                                          where f.ORDERS ==item.ORDER_ID 
                                          && f.ORDERS_SUFFIX==item.LINE
                                          select f.Something));