C# LINQ效率
考虑以下LINQ语句:C# LINQ效率,c#,linq,C#,Linq,考虑以下LINQ语句: var model = getModel(); // apptId is passed in, not the order, so get the related order id var order = (model.getMyData .Where(x => x.ApptId == apptId) .Select(y => y.OrderId)); var orderId = 0; var orderId = order.LastOr
var model = getModel();
// apptId is passed in, not the order, so get the related order id
var order = (model.getMyData
.Where(x => x.ApptId == apptId)
.Select(y => y.OrderId));
var orderId = 0;
var orderId = order.LastOrDefault();
// see if more than one appt is associated to the order
var apptOrders = (model.getMyData
.Where(x => x.OrderId == orderId)
.Select(y => new { y.OrderId, y.AppointmentsId }));
这段代码按预期工作,但我忍不住认为有一种更有效的方法来实现这一目标(一次对db的调用)
有没有办法将上面的两个LINQ语句组合成一个?对于这个问题,请假设我需要使用LINQ。这似乎是您所需要的全部:
var apptOrders =
model
.getMyData
.Where(x => x.ApptId == apptId)
.Select(y => new { y.OrderId, y.AppointmentsId });
您可以使用GroupBy方法按OrderId对所有订单进行分组。应用LastOrDefault和ToList后,将得到与上述代码相同的结果 下面是一个示例代码:
var apptOrders = model.getMyData
.Where(x => x.ApptId == apptId)
.GroupBy(s => s.OrderId)
.LastOrDefault().ToList();
实体框架无法转换
LastOrDefault
,但它可以通过子查询处理包含的,因此可以将医嘱ID
作为查询进行查找,并通过以下方式过滤医嘱:
// apptId is passed in, not the order, so get the related order id
var orderId = model.getMyData
.Where(x => x.ApptId == apptId)
.Select(y => y.OrderId);
// see if more than one appt is associated to the order
var apptOrders = model.getMyData
.Where(a => orderId.Contains(a.OrderId))
.Select(a => a.ApptId);
var orderId=0;foreach(顺序中的var item){orderId=item;}
可以替换为var orderId=order.LastOrDefault()代码>@mjwills捕捉得很好。@GuruStron问题已更新。getMyData是数据存储中的一个表。但是,如果有两个或多个订单具有相同的apptId,如何定义这些订单中的哪一个是最后一个?如果没有OrderBy,您将决定权留给db如何检索订单。您的ORM是什么?实体框架?不,我需要所有共享相同orderid的人。我现在没有可访问的orderid,这就是我首先查找它的原因。@Neo-是的,但您是通过ApptId
来执行此操作的。基于您问题中的代码,这看起来仍然与我相同。您的回答假设具有特定ApptId
的所有数据也都具有相同的OrderId
,我高度怀疑这是一种情况,最初我没有订单id。这与您在代码中所做的相同。它根据给定的apptId过滤订单,然后根据订单Id对其进行分组,然后根据最后一个订单Id进行订单。啊,我错过了按订单Id进行分组。我将在稍后对此进行测试。