【问题标题】:How to convert a lambda expression to LINQ?如何将 lambda 表达式转换为 LINQ?
【发布时间】:2018-12-26 05:36:31
【问题描述】:

如何将此表达式转换为 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 个表。

但这就是我设法做到的。是否可以在同一个查询中进行连接?

【问题讨论】:

  • 是的...你可以使用join...stackoverflow.com/questions/5571861/…
  • 你为什么要这样做?
  • @Backs 它是更大的 LINQ 语句的一部分,我宁愿继续使用 LINQ 而不是与 lambda 表达式混合使用。

标签: c# linq


【解决方案1】:

我猜你想要这个:

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

【讨论】:

    【解决方案2】:

    您的意思是如何将方法(或流利的)语法转换为查询(或理解)语法。首先要注意的是没有一个 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();
    

    优点是您不需要空传播运算符,顺便说一下,您在自己的语句中没有充分应用它。

    一个可能的问题是结果不一定相同。最初,您查询 a 第一个满足条件的用户及其组 a 第一个满足另一个条件的组。替代查询查询满足条件的所有用户,并从他们的组中查询第一个满足另一个条件的用户。所以第一个查询可能不会返回第二个查询的结果(如果匹配组不是来自第一个用户)。

    这可能是改进还是缺陷,我不知道。如果第一个条件唯一标识用户,则无关紧要;结果将是相同的。如果不是,您可能不得不质疑它的价值,因为在某种程度上它会给您返回一个“随机”用户。您可能希望使用 lambda 表达式将搜索范围缩小到一个特定的用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      相关资源
      最近更新 更多