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
答案 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;