我有一个问题得到一个可重用的lambda表达式与AutoMapper项目()的工作。扩展方法。我使用的是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();
是否有任何方法可以让代码块1工作?是否有另一种方式,我可以定义我的lambda表达式来解决这个编译错误?
IQueryable
对象不与委托一起工作,它们与表达式一起工作。你可以用同样的方式初始化它们,但是你必须用不同的方式声明它们。
Expression<Func<Product, bool>> myLambda = x => (x.Season.Id == 3);
试一下,看看是否有效。
问题是因为你传递了一个委托,你最终使用了这个版本的.Where(
输出一个IEnumerable,问题是.Project<T>()
需要一个IQueyable<T>
,要得到,你必须使用这个版本的.Where(
,你可以看到只有在Expression<Func<TSource, bool>>
而不是Func<TSource, bool>
。