ef7无法检索子集合的子对象的属性

时间:2015-12-17 06:55:54

标签: c# entity-framework asp.net-core asp.net-core-mvc

EF7 doesn't support lazy loading of child objects,但支持.Include()功能。话虽这么说,我正在努力解决一些事情,我不确定它是否在EF7中是不可能的,或者我只是盯着这个太久了。

假设类似以下内容(检查reg.Activities.Task.Ordinal(一个int),任务总是为空,即使我自己检查数据库并确定实际上存在相关记录)...

public void SomeOtherMethod()
    var r = getRegistration(User.UserName);
    var act = r.Activities
      .Where(a => a.IsDone == false)  // unfinished
      .OrderByDescending(o => o.Task.Ordinal)  // Task indicates activity type, is always null
      .FirstOrDefault();  // to get a user's most recent unfinished activity

    //DO SOMETHING WITH ACT
}

public Registration getRegistration(string userName) {
    var reg = _context.Registrations
      .Where(r => r.User.UserName == userName)  // this works however?
      .Include(r => r.Acvitities)  // List<Activity>
      .FirstOrDefault();

      return reg;
}

...我在模型类中有navigation properties,但上面的.Task为null且未加载。

此外,由于已经预测了查询,因此在创建.Include时我无法act其他属性。我无法.ThenInclude创建reg,因为类Registration不包含Task属性的定义(但Registration确实有Activities的集合1}} List<Activity>Activity确实有一个Task与另一个表/类相关,这个表/类定义了每个{{1}应该向用户呈现的任务和顺序}}

我尝试了Activity.Join.Include的各种咒语,希望能够在返回时.ThenInclude加入每个Task Activities对象,但由于Registration本身不包含Registration属性,因此失败。

我考虑过在GitHub上创建一个新问题,但我还不确定它是不是很可行而且我只是没有正确地看待它。


UPDATE1: Mihail建议使用...
Task
......但这会产生例外。这个SO(https://stackoverflow.com/a/30151601/3246805)表示应该使用EF5和.Include(r => r.Activities.Select(resp => resp.Responses))

然而,尝试这个建议......
.ThenInclude
......产生以下异常......

.ThenInclude(r => r.Select(t => t.Task))



UPDATE2:斯塔福德要求架构。最好的共同努力...

The properties expression 'r => {from Activity t in r select [t].Task}' is not valid. The expression should represent a property access: 't => t.MyProperty'. When specifying multiple properties use an anonymous type: 't => new { t.MyProperty1, t.MyProperty2 }'.
Parameter name: propertyAccessExpression

1 个答案:

答案 0 :(得分:12)

使用Include后跟ThenInclude来查看孩子的子属性。子属性可能不会出现在ThenInclude的intellisense中,但只需输入它 - 它将按预期编译和运行。

var reg = _context.Registrations
  .Where(r => r.User.UserName == userName)
  .Include(r => r.Acvitities).ThenInclude(a => a.Task)
  .Include(r => r.Activities).ThenInclude(a => a.SomethingElse)
  .FirstOrDefault();
  return reg;