繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM