我是Linq的新手,我正在努力解决我认为的延迟执行问题。我的应用程序中有一个数据层,它使用Linq到Sql,然后使用WCF服务(MVVM体系结构)将实体传递给viewmodel。此时对象将被序列化。
我正在传递一个Employee对象,该对象应该有一个子Rota对象,但是当我尝试在WCF的视图模型中访问它时,Rota为null。如果我在调试之前在调试中查看employee对象,那么Rota将被序列化并在我的View Model中可用。我的Linq查询是一个简单的选择,我如何让它通过rota?我可以遍历每个员工以枚举查询和rota对象,但这感觉非常错误。
答案 0 :(得分:3)
由于您使用的是LinqToSql,因此在获取对象时应使用DataContext.LoadWith。这是告诉LinqToSql它应该下拉什么的首选方法(因为它默认为延迟加载)。
DataLoadOptions options = new DataLoadOptions();
options.LoadWith((Employee c) => c.Rota);
db.LoadOptions = options;
http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx
与调用ToList或单独扩展EntityRef属性相比,这样可以在SQL端提高效率。
答案 1 :(得分:0)
我认为Rota包含在一个集合中。将集合类型设置为List<Rota>
,如果是这种情况,这应该有效。
答案 2 :(得分:0)
您已经走上了正确的轨道 - 只有在您迭代它时才会执行查询(在调试模式下检查它也会导致此迭代)。只需在IQueryable上调用ToList()
(然后迭代它),然后再通过Web服务发送它。