因此,我一直在使用带有IQueryable扩展名的AutoMapper为列表视图选择一些非常简单的视图模型。这使我无法加载整个实体框架对象,但是遇到了一种不太理想的情况,我需要为单个复杂对象提取一个简单的视图模型。
userQuery.Where(u => u.Id == id).ProjectTo<SimpleUserViewModel>().FirstOrDefault();
我可以做一个普通的AutoMapper.Map,但是当我可能只需要一个子属性而不希望承担数据库检索成本时,就可以拉入整个对象和子对象。
是否有更好的方法来获取单个实体并通过实体框架发出仅用于获取必要对象的选择?
答案 0 :(得分:2)
看起来效率低下,但事实并非如此。
就像许多其他 LINQ 方法一样,最值得注意的是它替换的 Select
,ProjectTo<>
依赖于延迟执行。它不会提取数据,直到必须呈现(或处理)数据为止。
触发此执行的常见方法是 ToList
、First
、Single
(包括所有这些的 OrDefault
和 Async
变体)。本质上,任何需要实际了解数据集本身的操作。
我知道那种感觉,不能做 ProjectToSingle<SimpleUserViewModel>(x => x.Id == id)
之类的事情感觉不太优雅。如果它真的困扰你,你可以自己编写这个包装器方法,基本上将它转换为一个 Where
/ProjectTo
/Single
链。
我也有同样的感觉,但我已经习惯了写 Where
/ProjectTo
/Single
并且不再觉得有错。这仍然比必须编写包含语句要好得多。
另外,顺便说一句,即使您没有使用 Automapper,但您仍然希望减少获取的列(因为您知道不需要所有列)加载整个实体,您仍然需要使用 Where
/Select
/Single
方法链。
因此 Automapper 并没有让语法变得比使用常规 LINQ/EF 时更不优雅。