[英]How to convert a lambda expression to 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).FirstOrDefault()?
我的班级是:
public class User
{
public string Name { get; set; }
public IEnumerable<Group> Groups { get; set; }
}
创建此查询时,我没有单独的groups
列表,我可以使用该列表在2个表上进行连接。
但那是我走了多远。 是否可以在同一个查询中进行连接?
我想你想要这个:
var result = (from g in ((from u in users
where u.Name == userName
select u).FirstOrDefault().Groups)
where g == userGroup
select g).FirstOrDefault();
你的意思是如何将方法(或流利的)语法转换为查询(或理解)语法。 首先要注意的是没有一个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-propagation操作符,顺便说一句,你没有在你自己的语句中充分应用。
一个可能的问题是结果不一定相同。 最初,您查询满足条件的第一个用户及其组,第一个组满足另一个条件。 备用查询查询满足条件的所有用户,并从其组中查询满足另一个条件的第一个用户。 因此第一个查询可能不返回第二个查询的结果(如果匹配组不是来自第一个用户)。
这可能是一种改进或缺陷,我不知道。 如果第一个条件唯一地标识用户则无关紧要; 结果将是一样的。 如果不是,你可能不得不质疑它的价值,因为在某种程度上它会给你一个“随机”的用户。 您可能希望使用lambda表达式,将搜索范围缩小到一个特定用户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.