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

use*_*893 5 c# linq lambda iqueryable automapper

我在使用 AutoMapper Project().To 扩展方法获取可重用的 lambda 表达式时遇到问题。我正在使用 AutoMapper 3.1.1。

我希望能够通过将 lambda 表达式定义为变量来重用它,但是在使用扩展方法时遇到了问题。

注意下面显示的代码和 lambda 表达式是简化的,我的 lambda 表达式非常复杂,我想在很多地方重用它。

这是一个要重用的 lambda 表达式:

Func<Product, bool> myLambda = x => (x.Season.Id == 3);
Run Code Online (Sandbox Code Playgroud)

代码块 1使用 Project().To<> 和可重用的 lambda,甚至无法编译。

var dtos =
                _unitOfWork.ProductRepository.All()
                    .Where(myLambda)
                    .Project().To<ProductGridDTO>()
                    .OrderBy(dynamicSort)
                    .Skip(skip)
                    .Take(take)
                    .ToList();
Run Code Online (Sandbox Code Playgroud)

它给出了以下编译错误:

错误 18

“System.Collections.Generic.IEnumerable”不包含“Project”的定义,并且找不到接受“System.Collections.Generic.IEnumerable”类型的第一个参数的扩展方法“Project”(您是否缺少 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();
Run Code Online (Sandbox Code Playgroud)

代码块 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();
Run Code Online (Sandbox Code Playgroud)

有什么办法可以让代码块 1工作。有没有另一种方法可以定义我的 lambda 表达式来解决这个编译错误?

Sco*_*ain 4

IQueryable对象不能与委托一起使用,它们可以与表达式一起使用。您可以以相同的方式初始化它们,但必须以不同的方式声明它们。

Expression<Func<Product, bool>> myLambda = x => (x.Season.Id == 3);
Run Code Online (Sandbox Code Playgroud)

尝试一下,看看是否有效。

问题是因为您传入了一个委托,您最终使用了输出 IEnumerable的此版本,问题是需要 a并且要获取您必须使用只能看到 a而不是 a 的此版本.Where(.Project<T>()IQueyable<T>.Where(Expression<Func<TSource, bool>>Func<TSource, bool>