AutoMapper ProjectTo如何针对单个实体使用?

6

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

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

我可以进行普通的AutoMapper.Map操作,但这会拉取整个对象和子对象,而我可能只需要子对象中的一个属性,并且我不想承担数据库检索成本。
对于获取单个实体并通过实体框架发出选择以仅获取必要的对象,有更好的方法吗?

你的方法有什么问题吗?在我看来它看起来很好 - AM会进行投影(Select),而你则通过过滤(Where + FirstOrDefault)来完成。 - Ivan Stoev
并不是这种方法本身存在问题,只是它有点丑陋而且不够简洁。我希望AM能够用更简单的方式来实现这个功能。 - Ryan B
1
没有。AutoMapper是用来帮助“选择”的。所有其他的东西都留给标准LINQ运算符。 - Ivan Stoev
1个回答

6

看起来效率低下,但实际上并不是。

就像许多其他LINQ方法一样,尤其是它替代的SelectProjectTo<>依赖于延迟执行。直到达到呈现(或处理)数据的时候,它才会提取数据。

触发此执行的常见方法包括ToListFirstSingle(包括所有这些方法的OrDefaultAsync变体)。实际上,任何需要实际数据集本身的知识的操作都可以。

我了解这种感觉,不能像ProjectToSingle<SimpleUserViewModel>(x => x.Id == id)那样做会让人感觉不太优雅。如果这真的困扰你,你可以自己编写这个包装器方法,从根本上将其转换为Where/ProjectTo/Single链。

我也有同样的感觉,但我已经习惯了编写Where/ProjectTo/Single,而且现在感觉并不错。它仍然比编写包含语句要好得多。


另外,作为旁注,即使您不使用Automapper,但您仍然想减少获取的列(因为您知道您不需要所有列),而不是加载整个实体,您仍需要使用Where/Select/Single方法链。

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


https://github.com/AutoMapper/AutoMapper.EF6/blob/master/README.md - Lucian Bargaoanu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接