AutoMapper Project()。To<T> 和可重用的 lambda 表达式



我有一个问题得到一个可重用的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>

相关内容

  • 没有找到相关文章

最新更新