代码之家  ›  专栏  ›  技术社区  ›  Ivan-Mark Debono

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

  •  1
  • Ivan-Mark Debono  · 技术社区  · 6 年前

    如何将此表达式转换为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 回复  |  直到 6 年前
        1
  •  2
  •   Zhuravlev A.    6 年前

    我猜你想要这个:

    var result = (from g in ((from u in users
                              where u.Name == userName
                              select u).FirstOrDefault().Groups)
                  where g == userGroup
                  select g).FirstOrDefault();
    
        2
  •  1
  •   Gert Arnold    6 年前

    var user = users.FirstOrDefault(x => x.Name == userName);
    var result = user?.Groups.FirstOrDefault(x => x.Group == userGroup);
    

    …这两个都可以用查询语法编写,您的起点是第一个。

    SelectMany :

    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传播运算符。

    A. 满足条件的第一个用户及其组 A. 第一组满足另一个条件。备选查询查询满足某个条件的所有用户,并从其组中查询满足另一个条件的第一个用户。因此,第一个查询可能不会返回第二个查询返回的结果(如果匹配组不是来自第一个用户)。