我在使用AutoMapper Project()获取可重用的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’的定义,并且没有扩展方法’Project’可以找到接受类型’System.Collections.Generic.IEnumerable’的第一个参数(你是否缺少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();
有什么方法可以让Code Block 1工作.有没有其他方法可以定义我的lambda表达式来解决这个编译错误?
解决方法:
IQueryable对象不能与委托一起使用,它们与Expressions一起使用.您以相同的方式初始化它们,但必须以不同方式声明它们.
Expression<Func<Product, bool>> myLambda = x => (x.Season.Id == 3);
试试看,看看它是否有效.
问题是因为你传递了一个委托,你最终使用了this version of .Where(输出IEnumerable,问题是.Project< T>()需要一个IQueyable< T>并且得到它你必须使用this version of .Where (你只能看到表达式< Func< TSource,bool>>而不是Func< TSource,bool>.