我在使用AutoMapper Project()获取可重用的lambda表达式时遇到问题。对于扩展方法。我正在使用AutoMapper 3.1.1。
我希望能够通过将lambda表达式定义为变量来重用它,但是在使用扩展方法时遇到了这个问题。
注意下面显示的代码和lambda表达式是简化的,我的lambda表达式非常复杂,我想在很多地方重用它。
这是一个要重用的lambda表达式:
Func<Product, bool> myLambda = x => (x.Season.Id == 3);
代码块1 使用Project()。To&lt;&gt;和可重复使用的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&lt;&gt;只返回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&lt;&gt;和相同的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表达式来解决这个编译错误?
答案 0 :(得分:4)
IQueryable
个对象不能与代理一起使用,它们与Expressions一起使用。你以相同的方式初始化它们,但你必须以不同的方式声明它。
Expression<Func<Product, bool>> myLambda = x => (x.Season.Id == 3);
尝试一下,看看它是否有效。
问题是因为您传递了一个委托,最后使用.Where(
.Project<T>()
输出了IEnumerable,问题是IQueyable<T>
需要.Where(
并获得您必须使用Expression<Func<TSource, bool>>
Func<TSource, bool>
{{1}},{{1}}只能看到{{1}}而不是{{1}}。