C# 如何将lambda表达式转换为LINQ?
如何将此表达式转换为LINQC# 如何将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
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表达式混合使用。