C# 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

考虑以下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.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进行分组。我将在稍后对此进行测试。