c# – AutoMapper Project().to和可重用的lambda表达式

我在使用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>.

上一篇:c# – 具有相同类型的嵌套Dtos的Dto失败


下一篇:c# – 使用AutoMapper的IMappingEngine和DI有什么好处(如果有的话)