假设我有两个看起来像这样的类:
public class Foo
{
public ICollection<Bar> Bars { get; set; }
public static Expression<Func<Foo, Bar>> GetNewestBar()
{
return foo => foo.Bars.OrderByDescending(bar => bar.DateCreated).FirstOrDefault();
}
}
public class Bar
{
public string Value { get; set; }
public DateTime DateCreated { get; set; }
public static Expression<Func<Bar, bool>> ValueIs(string value)
{
return bar => bar.Value == value;
}
}
这些都被剥夺了与手头问题无关的所有属性。在编写LINQ to EF查询时,这两个类的表达式可以安全地用作谓词。现在让我们说我想在NewestBarValueIs
类中添加一个名为Foo
的方法。它看起来像这样:
public static Expression<Func<Foo, bool>> NewestBarValueIs(string value)
{
return foo => foo.Bars.OrderByDescending(bar => bar.DateCreated)
.FirstOrDefault()
.Value == value;
}
这是一个简单的例子,但是NewestBarValueIs
返回的lambda由与Foo.GetNewestBar
和Bar.ValueIs
完全相同的代码组成。如果我们返回的是Funcs而不是Funcs的表达式,那么NewestBarValueIs
的主体写起来会非常简单:
return foo => Bar.ValueIs(value)(GetNewestBar()(foo));
使用Funcs的表达来实现这一点让我很难过。我发现的所有代码示例都构成了多个逻辑表达式,而不是返回对象实例的表达式。那么如何使用表达式以与实体框架相配的方式编写Foo.NewestBarValueIs
?