C# 多位置Linq查询

C# 多位置Linq查询,c#,linq,C#,Linq,我正在使用linq c获取由用户OrderId选择的服务ID 因为用户可以有多个OrderId,所以我需要获得每个id的服务 为此,我使用foreach循环并从数据库中获取ServiceId。检查每个OrderId需要很长时间,ServiceId可以是列表形式 有没有方法只调用数据库一次就得到结果 此外,OrderId必须是可区分的,例如每个id上有多少个服务 代码 如果您需要所有服务id,则应使用此连接方法no-foreach: 但是我如何区分哪个orderid上的哪个服务呢 这是一份清单吗

我正在使用linq c获取由用户OrderId选择的服务ID

因为用户可以有多个OrderId,所以我需要获得每个id的服务

为此,我使用foreach循环并从数据库中获取ServiceId。检查每个OrderId需要很长时间,ServiceId可以是列表形式

有没有方法只调用数据库一次就得到结果

此外,OrderId必须是可区分的,例如每个id上有多少个服务

代码


如果您需要所有服务id,则应使用此连接方法no-foreach:


但是我如何区分哪个orderid上的哪个服务呢 这是一份清单吗

嗯,你的问题中没有提到这一点。但是,您可以使用以下查询创建字典,其中OrderId是键,值都是ServiceID:


如果您需要所有服务id,则应使用此连接方法no-foreach:


但是我如何区分哪个orderid上的哪个服务呢 这是一份清单吗

嗯,你的问题中没有提到这一点。但是,您可以使用以下查询创建字典,其中OrderId是键,值都是ServiceID:


这就像您试图查找任何orderInfoDetailList值中存在的下拉id的所有实例一样。如果是这样,请尝试以下方法

var services =  db.OrderServiceTBs.Where(i=>orderInfoDetailList.Any(x=>x.orderObj.OrderID == i.OrderID)).Select(x=> x.ServiceID).ToList();

这就像您试图查找任何orderInfoDetailList值中存在的下拉id的所有实例一样。如果是这样,请尝试以下方法

var services =  db.OrderServiceTBs.Where(i=>orderInfoDetailList.Any(x=>x.orderObj.OrderID == i.OrderID)).Select(x=> x.ServiceID).ToList();

您正在使用服务做什么?问题还不清楚,我不知道如何改进而不知道你在做什么。这似乎是一个问题。您试图实现的最终目标是什么?您是否尝试过使用orderInfoDetailList.ContainsiorDelid?@Console此功能无法很好地扩展,并且会在较长的列表中崩溃。如何获取orderInfoDetailList?如果你在一个查询中得到它,你也可以在一个简单的查询中得到服务。如果它只是一个任意列表,并且您在mssql服务器上,请查看TVP表值参数。您在使用服务做什么?问题还不清楚,我不知道如何改进而不知道你在做什么。这似乎是一个问题。您试图实现的最终目标是什么?您是否尝试过使用orderInfoDetailList.ContainsiorDelid?@Console此功能无法很好地扩展,并且会在较长的列表中崩溃。如何获取orderInfoDetailList?如果你在一个查询中得到它,你也可以在一个简单的查询中得到服务。如果只是任意列表,并且您在mssql服务器上,请查看TVP表值参数。根据我的测试,这将查询整个OrderServiceTBs表并在客户端对其进行过滤,这是非常低效的。但是我如何区分哪个orderid上的哪个服务,因为这提供了列表?@JustForTest:您没有提到这一点很重要,请告诉我怎么做。将选择更改为选择新的{I.ServiceID,I.orderid}这将创建一个具有两个值的匿名对象根据我的测试,这将查询整个OrderServiceTBs表并在客户端对其进行筛选,这是非常低效的。但是我如何区分哪个orderid上的哪个服务,因为这提供了列表?@JustForTest:您没有提到这一点很重要,请告诉我怎么做。将选择更改为选择新的{I.ServiceID,I.orderid}这将创建一个具有这两个值的匿名对象,但我如何区分哪个服务上的orderid,因为它提供了列表?但我如何区分哪个服务上的orderid,因为它提供了列表?
var orderGroups = from o in orderInfoDetailList
                  join i in db.OrderServiceTBs 
                  on o.orderObj.OrderID equals i.OrderID 
                  group i by o.OrderID into orderGroup
                  select orderGroup;
var orderLookup = orderGroups.ToDictionary(g => g.Key, g => g.Select(x => x.ServiceID).ToList());
var services =  db.OrderServiceTBs.Where(i=>orderInfoDetailList.Any(x=>x.orderObj.OrderID == i.OrderID)).Select(x=> x.ServiceID).ToList();