因此,我一直在使用带有 IQueryable 扩展的 AutoMapper 来为列表视图选择一些非常简单的视图模型。这允许我不加载整个实体框架对象,但我遇到了一个不太理想的情况,我需要为单个复杂对象提取一个简单的视图模型。userQuery.Where(u => u.Id == id).ProjectTo<SimpleUserViewModel>().FirstOrDefault();我可以做一个普通的 AutoMapper.Map,但这会引入整个对象和子对象,而我可能只需要子对象的一个属性并且我不想吃数据库检索成本。有没有更好的方法来获取单个实体并通过实体框架发出选择以仅获取必要的对象?
1 回答
三国纷争
TA贡献1804条经验 获得超7个赞
它看起来确实效率低下,但事实并非如此。
就像许多其他 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 的语法更优雅。
- 1 回答
- 0 关注
- 95 浏览
添加回答
举报
0/150
提交
取消