【发布时间】:2014-04-23 09:56:25
【问题描述】:
我在获取与 AutoMapper Project().To 扩展方法一起使用的可重用 lambda 表达式时遇到问题。我正在使用 AutoMapper 3.1.1。
我希望能够通过将 lambda 表达式定义为变量来重用它,但是在使用扩展方法时遇到了问题。
注意下面显示的代码和 lambda 表达式是简化的,我的 lambda 表达式非常复杂,我想在很多地方重用它。
这是一个要重用的 lambda 表达式:
Func<Product, bool> myLambda = x => (x.Season.Id == 3);
代码块 1 使用 Project().To 和可重用的 lambda,甚至无法编译。
var dtos =
_unitOfWork.ProductRepository.All()
.Where(myLambda)
.Project().To<ProductGridDTO>()
.OrderBy(dynamicSort)
.Skip(skip)
.Take(take)
.ToList();
它给出以下编译错误:
错误 18
“System.Collections.Generic.IEnumerable”不包含“Project”的定义,并且找不到接受“System.Collections.Generic.IEnumerable”类型的第一个参数的扩展方法“Project”(您是否缺少using 指令还是程序集引用?)
代码块 2 使用 .Select() 和 Mapper.Map() 并编译和工作,但生成的 SQL 查询返回所有列。我想使用 Project().To 在 SQL 查询中只返回一组最小的列,从而更高效、更快。
var dtos =
_unitOfWork.ProductRepository.All()
.Where(myLambda)
.Select(y => Mapper.Map(y, new ProductGridDTO()))
.OrderBy(dynamicSort)
.Skip(skip)
.Take(take)
.ToList();
代码块 3 使用 Project().To 和相同的 lambda,但作为内联代码。它编译和工作正常,但不允许我重用我的 lambda 表达式。
var dtos3 =
_unitOfWork.ProductRepository.All()
.Where(x => (x.Season.Id == 3))
.Project().To<ProductGridDTO>()
.OrderBy(dynamicSort)
.Skip(skip)
.Take(take)
.ToList();
有什么方法可以让 代码块 1 工作。有没有另一种方法可以定义我的 lambda 表达式来解决这个编译错误?
【问题讨论】:
标签: c# linq lambda automapper iqueryable