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;
});
我有 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;
});