我一直在努力,并试图让我的思绪围绕着这些概念。任何帮助将不胜感激。给定一个表中的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')。
我真的希望我的问题有道理。如果我没有正确解释我的情况,我会提前道歉。我一直在做的是将大部分表拉到内存中进行迭代,但我担心这会导致性能问题,并希望看看是否有更好的方法来过滤结果查询。
答案 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));