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 表达式来解决这个编译错误?
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>
| 归档时间: |
|
| 查看次数: |
1909 次 |
| 最近记录: |