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

本文关键字:情况下 查询 实体 集合 foreach | 更新日期: 2023-09-27 18:35:05

我一直在挣扎,并试图让我的思想被这些概念所包围。任何帮助将不胜感激。给定一个表中的订单集合,迭代它并对其他表执行查询的最佳方式是什么。

这个循环可以做我想要的,但我已经被告知并展示了这如何导致性能问题。在其他帖子中,我读过最好在循环之外查询 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();

不支持异常:无法创建类型为"匿名类型"的常量值。在此上下文中仅支持基元类型("Int32、字符串和 Guid")。

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

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

如果你把你的第一次尝试和最后一次尝试结合起来,你就会得到它。如果不创建匿名类型,最后一次尝试就可以了。

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

看看这些:

http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/095745fe-dcf0-4142-b684-b7e4a1ab59f0/

Linq to Entities - SQL"IN"子句

试试这个:

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