Asp.net db.Entry.Collection.Query没有急切地加载所有虚拟属性
我有以下场景(合并在一行中) 让我们假设用户对象将帖子作为虚拟属性(以便急切地加载它们)前一行的结果仅为该用户加载一篇帖子,而如果我执行以下操作之一:Asp.net db.Entry.Collection.Query没有急切地加载所有虚拟属性,asp.net,asp.net-mvc,entity-framework,eager-loading,Asp.net,Asp.net Mvc,Entity Framework,Eager Loading,我有以下场景(合并在一行中) 让我们假设用户对象将帖子作为虚拟属性(以便急切地加载它们)前一行的结果仅为该用户加载一篇帖子,而如果我执行以下操作之一: var Users = db.Entry(obj).Collection(collection).Query().ToList().Where(/*some condition*/).FirstOrDefault(/*some condition*/); //added ToList() after the Query method //OR d
var Users = db.Entry(obj).Collection(collection).Query().ToList().Where(/*some condition*/).FirstOrDefault(/*some condition*/);
//added ToList() after the Query method
//OR
db.Users.Where(/*full condition*/).FirstOrDefault()
//OR
db.Users.FirstOrDefault(/*full condition*/)
所有这些都会加载用户的所有帖子、我在第一次查询中缺少的内容,以及我如何通过它加载所有帖子?尝试在第一次查询中的之后添加。包括(VirtualPropertyToGuardLoad)
请参阅使用即时加载的相关内容。尝试在第一个查询中的位置后添加。包括(VirtualPropertyToGuardLoad)
请参阅有关使用即时加载的说明。使用.Include()
我强烈建议使用Lambda表达式而不是神奇字符串。对于方法include的lambda表达式,您必须使用名称空间System.Data.Entity
,但您知道为什么它加载了一个条目吗?我不是肯定的,但我猜您的第一个查询没有命中集合中的所有项(因此不会加载它们的nav属性)。第一个工作查询通过ToList访问整个集合,第二个和第三个工作查询都访问db.Users,这是整个对象集合。使用.Include()
我强烈建议使用Lambda表达式而不是神奇字符串。对于方法include的lambda表达式,您必须使用名称空间System.Data.Entity
,但您知道为什么它加载了一个条目吗?我不是肯定的,但我猜您的第一个查询没有命中集合中的所有项(因此不会加载它们的nav属性)。而第一个工作查询通过ToList访问整个集合,第二个和第三个工作查询都访问db.Users,这是整个对象集合。virtual
修饰符不适用于即时加载。它是用来启用延迟加载的。virtual
修饰符不用于快速加载。这是为了启用延迟加载。
var Users = db.Entry(obj).Collection(collection).Query().ToList().Where(/*some condition*/).FirstOrDefault(/*some condition*/);
//added ToList() after the Query method
//OR
db.Users.Where(/*full condition*/).FirstOrDefault()
//OR
db.Users.FirstOrDefault(/*full condition*/)