【问题标题】:How can I set x.foo = y during a Linq Join?如何在 Linq 加入期间设置 x.foo = y?
【发布时间】:2015-10-14 22:51:29
【问题描述】:

我已经定义了实体 Foo 和 Bar,这样 Foo 就有一个非映射的 Bar。 Bar 未映射的原因是,给定的 Foo 可能会映射到许多不同的单个 Bars,具体取决于执行代码时传入的 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。

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

【问题讨论】:

  • 不要改变查询中的对象,创建一个包含您想要的所有信息的新对象。

标签: c# entity-framework linq


【解决方案1】:

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();
}

【讨论】:

  • 它实际上是否会阻止您更新,或者这只是最佳实践?我知道你不能交换你得到的对象(比如 foreach?!),但是你能改变它的字段和其他属性吗?
  • 方法 进行更新,但它们很难看,不是好习惯。这可不像将投影更改为作业那么简单。
  • 有没有办法在不枚举 Queryable 的情况下做到这一点?理想情况下,我希望能够在执行查询之前应用几个额外的过滤器。
  • 不确定您的意思,但您可以随时添加 Where 子句 - 无论是在基本查询中还是在 foreach (foreach(var s in stuff.Where( /* filter */))) 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多