C# 如何将lambda表达式转换为LINQ?

C# 如何将lambda表达式转换为LINQ?,c#,linq,C#,Linq,如何将此表达式转换为LINQ var result = users.FirstOrDefault(x => x.Name == userName)? .Groups.FirstOrDefault(x => x.Group == userGroup); 我从以下几点开始: var result = (from u in users where u.Name == userName select u).FirstOrDef

如何将此表达式转换为LINQ

var result = users.FirstOrDefault(x => x.Name == userName)?
    .Groups.FirstOrDefault(x => x.Group == userGroup);
我从以下几点开始:

var result = (from u in users
              where u.Name == userName
              select u).FirstOrDefault()?
我的班级是:

public class User
{
    public string Name { get; set; }
    public IEnumerable<Group> Groups { get; set; }
}
公共类用户
{
公共字符串名称{get;set;}
公共IEnumerable组{get;set;}
}
创建此查询时,我没有一个单独的
列表,可以使用该列表对两个表进行联接

但这就是我所能做到的。是否可以在同一个查询中进行联接?

我想您希望这样:

var result = (from g in ((from u in users
                          where u.Name == userName
                          select u).FirstOrDefault().Groups)
              where g == userGroup
              select g).FirstOrDefault();

您的意思是如何将方法(或fluent)语法转换为查询(或理解)语法。但首先要注意的是,没有一个LINQ表达式。该语句由两个LINQ语句组成

var user = users.FirstOrDefault(x => x.Name == userName);
var result = user?.Groups.FirstOrDefault(x => x.Group == userGroup);
…这两个都可以用查询语法编写,您的起点是第一个

但是,可以使用
SelectMany
将语句重写为一条LINQ语句:

var result = users.Where(x => x.Name == userName)
    .SelectMany(u => u.Groups.Where(g => g.Group == userGroup))
    .FirstOrDefault();
此语句可以在一个查询语法语句中重写:

var result = (from u in users
    where u.Name == userName
    from g in u.Groups
    where g.Group == userGroup
    select g).FirstOrDefault();
优点是您不需要null传播运算符,顺便说一句,您在自己的语句中没有充分应用null传播运算符

一个可能的问题是结果不一定完全相同。最初,您查询满足条件的第一个用户及其组中满足另一条件的第一个组。备选查询查询满足某个条件的所有用户,并从其组中查询满足另一个条件的第一个用户。因此,第一个查询可能不会返回第二个查询返回的结果(如果匹配组不是来自第一个用户)


这可能是一个改进或缺陷,我不知道。如果第一个条件唯一地标识了用户,那么这并不重要;结果是一样的。如果没有,你可能不得不质疑它的值,因为在某种程度上它会返回一个“随机”用户。您可能希望使用lambda表达式将搜索范围缩小到一个特定用户。

是。。。您可以使用join…您想做什么?@Backs这是一个更大的LINQ语句的一部分,我宁愿继续使用LINQ,而不是与lambda表达式混合使用。