如何在Linq Join期间设置x.foo = y?

时间:2015-10-14 14:27:56

标签: c# entity-framework linq

我已定义实体Foo和Bar,以便Foo具有非映射条。 Bar未映射的原因是,给定的Foo可能会映射到许多不同的单个Bar,具体取决于执行代码时传入的GroupingId。

我的目标是使用Bar导航属性(如果存在)传回Foo实体的集合,下面是我目前尝试执行此操作的代码,但未成功。

var stuff = _Repository.Find<Foo>(x => Codes.Contains(x.Code))
.GroupJoin(_Repository.Find<Bar>(y => y.GroupingId == groupingId),
x => barId, 
y => Id, 
(x, y) => x.Bar = y.FirstOrDefault());

错误是无法从使用中推断出类型参数,我认为这是因为我没有指定在将y绑定到Bar属性后需要返回x。

我是否需要声明一个匿名函数来执行此操作,并且它是否适用于实体框架?

1 个答案:

答案 0 :(得分:4)

Linq用于查询,而非更新。如果您想要更新,那么您可以创建一个查询来获取所需的所有数据,然后使用foreach更改它们:

var stuff = _Repository.Find<Foo>(x => Codes.Contains(x.Code))
                       .GroupJoin(_Repository.Find<Bar>(y => y.GroupingId == groupingId),
                                  x => barId, 
                                  y => Id, 
                                  (x, ys) => new {x, ys});

foreach(var s in stuff)
{
   s.x.Bar = s.ys.FirstOrDefault();
}