AutoMapper Project()。到<t>和可重用的lambda表达式</t>

时间:2014-03-17 23:00:11

标签: c# linq lambda automapper iqueryable

我在使用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表达式来解决这个编译错误?

1 个答案:

答案 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}}。