gpt4 book ai didi

c# - AutoMapper ProjectTo 与单个实体?

转载 作者:行者123 更新时间:2023-12-04 15:54:53 25 4
gpt4 key购买 nike

所以,我一直在使用带有 IQueryable 扩展的 AutoMapper 来为 ListView 选择一些非常简单的 View 模型。这允许我不加载整个 Entity Framework 对象,但我遇到了一些不太理想的情况,我需要为单个复杂对象提取一个简单的 View 模型。

userQuery.Where(u => u.Id == id).ProjectTo<SimpleUserViewModel>().FirstOrDefault();

我可以做一个普通的 AutoMapper.Map,但是这会拉入整个对象和子对象,当我可能只需要子对象的一个​​属性并且我不想吃数据库检索成本时。

是否有更好的方法来获取单个实体并通过 Entity Framework 发出选择以仅获取必要的对象?

最佳答案

它看起来效率低下,但事实并非如此。
就像许多其他 LINQ 方法一样,最著名的是 Select它取代了,ProjectTo<>依赖 延期执行 .在达到必须呈现(或对数据采取行动)的程度之前,它不会提取数据。
触发此执行的常见方法是 ToList , First , Single (包括所有这些的 OrDefaultAsync 变体)。本质上,任何需要实际了解数据集本身的操作。
我知道那种感觉,不能做像ProjectToSingle<SimpleUserViewModel>(x => x.Id == id)这样的事情感觉不太优雅。 .如果它真的困扰你,你可以自己编写这个包装器方法,基本上将它翻译成 Where/ProjectTo/Single链。
我也有同样的感觉,但我已经习惯了写 Where/ProjectTo/Single并且不再觉得有什么不对了。它仍然比必须编写包含语句要好得多。

另外,顺便说一句,即使您没有使用 Automapper,但您仍然希望减少获取的列(因为您知道不需要所有列)而不是加载整个实体,您仍然需要使用 Where/Select/Single方法链。
因此 Automapper 并没有使语法比常规 LINQ/EF 更不优雅。

关于c# - AutoMapper ProjectTo 与单个实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52226586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com