AutoMapper ProjectTo 具有单个实体?

Rya*_*n B 6 c# asp.net-mvc automapper entity-framework-6

因此,我一直在使用 AutoMapper 和 IQueryable 扩展来为列表视图选择一些非常简单的视图模型。这使我无法加载整个实体框架对象,但我遇到了一些不太理想的情况,我需要为单个复杂对象提取一个简单的视图模型。

userQuery.Where(u => u.Id == id).ProjectTo<SimpleUserViewModel>().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

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

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

Fla*_*ter 6

它看起来确实效率低下,但事实并非如此。

就像许多其他 LINQ 方法(尤其是Select它所取代的方法)一样,ProjectTo<>依赖于延迟执行。在达到必须呈现(或对数据采取行动)的程度之前,它不会提取数据。

触发此执行的常见方法是ToListFirstSingle(包括所有这些方法的OrDefault和变体)。Async本质上,任何需要实际了解数据集本身的操作。

我知道这种感觉,无法做类似的事情感觉不太优雅ProjectToSingle<SimpleUserViewModel>(x => x.Id == id)。如果它确实让您烦恼,您可以自己编写这个包装方法,本质上是将其转换为Where//ProjectToSingle

我也有同样的感觉,但是我已经习惯了写Where// ,不再感觉有什么不对了。它仍然比必须编写 include 语句要好得多。ProjectToSingle


另外,顺便说一句,即使您没有使用 Automapper,但您仍然希望减少获取的列(因为您知道不需要所有列),而不是加载整个实体,您仍然需要使用Where//方法链。SelectSingle

因此,Automapper 并没有使语法比常规 LINQ/EF 的语法更加不优雅。