LINQ 查询以遍历列表的列表,但 select 上层的项目匹配给定的过滤条件

LINQ query to to iterate through list of lists but select an item at the upper level matching given filter conditions

我有以下 类:

Public Class User
{
public List<SpecificUser> SpecificUsers{get;set;}    
}

Public Class SpecificUser
{
public bool IsDefault{get;set;}
public List<SpecificUserRole> SpecificUserRoles{get;set;}
}

Public Class SpecificUserRoles
{
public bool IsPrimary{get;set;}
}

要求:给定一个用户对象,我只想获取 IsDefault=true 且(该特定用户)具有 'a' SpecificUserRole 的 SpecificUser 对象 与 IsPrimary=true。 这是我尝试过的,但它返回的是 bool 而不是 SpecificUser 的实例。

var defaultSpecificUser = user.SpecificUsers.Select(au => au.IsDefault && au.SpecificUserRoles.Select(aur => aur.IsPrimary).FirstOrDefault()).FirstOrDefault();

我可以通过两个查询来实现;但是想一次性完成:

var defaultSpecificUsers = user.SpecificUsers.Where(au => au.IsDefault).ToList();
var primarySpecificUser = defaultSpecificUsers .FirstOrDefault(ddau => ddau.SpecificUserRoles.Select(aur => aur.IsPrimary).FirstOrDefault());

我们将不胜感激任何帮助。 提前致谢。

这看起来很简单:

user.SpecificUsers.Where(su => su.IsDefault == true && su.SpecificUserRoles.Any(sr => sr.IsPrimary == true));

或简化:

user.SpecificUsers.Where(su => su.IsDefault && su.SpecificUserRoles.Any(sr => sr.IsPrimary);

当然,这假设不止一个特定用户符合条件。如果您只想要一个,请将 Where 替换为 FirstFirstOrDefault(如果您不确定是否存在)。