如何编写LINQ查询以从具有给定匹配ID集合的集合中进行选择

时间:2013-06-17 16:35:00

标签: c# linq lambda

我正在使用自我跟踪实体模型。 ProductInstallation是一个DTO,其中包含有关公司产品安装的所有详细信息。

UserRoles实体保存Product-System Role-UserID之间的关系。

举个例子:

  

产品:库存

     

系统角色:PurchasingUser

     

用户名:hasithaH< - (假设我)

使用下面的LINQ查询,我可以获得不同的UserID。

string[] userIDs = productInstallation.UserRoles
                  .Select(u=>u.UserID).Distinct().ToArray();

现在我需要获取上述步骤中查询的UserID的所有用户配置文件。

productInstallation.SystemUsers = context.SystemUsers.Select(u=> u.UserID ..??? 

从SQL的角度来看,这是我想要的查询:

Select * from SystemUsers where UserID in ('UserA','UserB','UserC')

我应该如何编写LINQ查询来完成这项工作?

3 个答案:

答案 0 :(得分:2)

你写如下:

var result = context.SystemUsers.Where(su => 
               productInstallation.UserRoles.Any(ur => su.UserID == ur.UserId));

或者,如果来自同一个数据库的两个来源都不是IQuerable

string[] userIDs = productInstallation.UserRoles
                  .Select(u=>u.UserID).Distinct().ToArray();

var result = context.SystemUsers.Where(su => 
                   userIDs.Contains(su.UserID));

答案 1 :(得分:1)

你可以试试这个:

productInstallation.SystemUsers = 
context.SystemUsers.FindAll(u=> userIDs.Contains(u.UserID))

答案 2 :(得分:1)

你真正想要做的就是加入两张桌子。使用Join您可以在一个查询中执行此操作,而不是执行两个单独的查询:

var systemUsers = from userRole in UserRoles
                  join systemUser in SystemUsers
                  on userRole.UserID equals systemUser.UserID
                  select systemUser;