【问题标题】:Left Outer Joins with Linq extension methods? [duplicate]使用 Linq 扩展方法进行左外连接? [复制]
【发布时间】:2017-01-05 04:33:00
【问题描述】:

你能帮我把这个 Linq 查询翻译成扩展方法吗:

    var query = from person in people
                join pet in pets on person equals pet.Owner into gj
                from subpet in gj.DefaultIfEmpty()
                select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) };

查询来自MSDN page关于左外连接。

我已经这样做了:

    var result = people.join(pets, x, y => y.Owner, (x, y) => {
                    x.FirstName,
                    PetName = y == null ? String.Empty : y.Name
                }).ToList();

但我不知道如何处理DefaultIfEmpty()

添加 DefaultIfEmpty() 如其他解决方案中所述导致 CS0746 Invalid anonymous type member declarator。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。

【问题讨论】:

  • 为什么一定要使用方法语法?联接在查询语法中更加更简洁,而方法语法在性能方面没有给您带来任何好处。

标签: c# linq


【解决方案1】:

GroupJoin 可以这样做

people.GroupJoin(pets,p => p,pt => pt.Owner,
                 (p, pt) => new { p.FirstName, names = pt.Select(y => y.Name)})
      .SelectMany(p => p.names.DefaultIfEmpty().Select(x => new {p.FirstName,PetName=x}))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2014-03-04
    • 2013-05-26
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多