lambda表达式是否可以应用于针对不同对象的查询?

时间:2018-02-08 19:47:35

标签: c# linq

有时能够将lambda表达式存储在业务逻辑中的某个位置是很好的,例如

Expression<Func<Supplier,bool>> SupplierHasHighRating = x => x.Rating > 90;

这就像规范模式的精简形式。所以你可以这样做:

var highRatedSuppliers = someQueryableOfSuppliers.Where(SupplierHasHighRating);

如果有一种方法可以在查询中针对与供应商相关的其他对象重用lambda,我想知道:

var productsOfHighRatedSuppliers = someQueryableOfProducts.Where(x => x.Supplier.Rating > 90);

我可以在某种程度上重用lambda吗?

编辑:如果您认为答案是肯定的,那么您能否根据上述示例展示如何做到这一点?

1 个答案:

答案 0 :(得分:-1)

正如人们所指出的那样:绝对可以用表情来做。 然而,在大多数现实场景中,创建此类功能所需的时间会使其变得不可行。例如,考虑所有因素;表现可能是一个问题。

创建表达式访问者需要时间,动态表达式 hard ,如果您不熟悉它们,您可能会在完成任何实际工作之前杀死几个小时。如果您以前从未尝试过,那只是......非常不直观。

还有其他方法可以解决这个问题;一种方法是简单地使用继承。

例如,创建一个IRateable,它只展示属性Rating。然后只需在需要的地方继承它。

如你的例子所示:

public class Supplier : IRateable
{
  public int Rating { get; set; }
}

public class Product : IRateable
{
  // Get's the suppliers rating, tho, is this what you wanted?
  public int Rating => Supplier.Rating;

  public Supplier Supplier { get; set; }
}