Linq left join 向左对象添加数据

Linq left join adding data to left object

我有 3 个实体:

class Foo {
  public Guid? BarId { get; set; } //Has optional bar

  [NotMapped]
  public boolean? HasXyzzy { get; set; }
}

class Bar {
  ...
}

class Xyzzy {
  public Guid BarId { get; set; } //Always has Bar
}

我想从数据库中检索一些 Foo 并填充它们的 HasXyzzy 属性。我正在使用 LINQ to entities 扩展方法。

我在想这样的事情:

var xyzzys = xyzzyRepository.GetAll(); //IQueryable

var foos = fooRepository.GetAll()
    .Where() //Some condition
    .SelectMany(
        foo => xyzzys.Where(xyzzy => xyzzy.BarId == foo.BarId).DefaultIfEmpty(),
        (foo, xyzzy) => new Foo {
            BarId = foo.BarId,
            HasXyzzy = xyzzy != null
        });

但这很乏味,因为我的 Foo class 有很多属性。

执行此操作的正确方法是什么?

您的代码:

 (foo, xyzzy) => new Foo {
                BarId = foo.BarId,
                HasXyzzy = xyzzy != null
            });

您已经有一个 Foo 作为参数,因此您可以将传入的委托更改为:

 (foo, xyzzy) =>
 { 
     foo.HasXyzzy = xyzzy;
     return foo;
 });

如果我错了请纠正我,fooRepository 带来了 List<Foo> 并且在 left join 之后你只想用来自 join 的额外数据来完成它们。

更新: 实际上我错了,因为我们这里有 IQueryable,它有表达式作为参数而不是委托,并且不能将带有语句体的 lambda 转换为表达式树。

现在,另一个想法不是最好的,因为它会使用额外的迭代,但仍然是转换为 IEnumerable 并执行相同的技巧。

    (foo, xyzzy) => new {
                   foo, xyzzy                   
                }).AsEnumerable()
.Select(x=> 
{ 
     foo.HasXyzzy = xyzzy;
     return foo;
});