编写以实体框架友好方式返回对象实例的表达式

时间:2016-10-26 19:57:47

标签: c# entity-framework linq lambda linq-expressions

假设我有两个看起来像这样的类:

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.GetNewestBarBar.ValueIs完全相同的代码组成。如果我们返回的是Funcs而不是Funcs的表达式,那么NewestBarValueIs的主体写起来会非常简单:

       return foo => Bar.ValueIs(value)(GetNewestBar()(foo));

使用Funcs的表达来实现这一点让我很难过。我发现的所有代码示例都构成了多个逻辑表达式,而不是返回对象实例的表达式。那么如何使用表达式以与实体框架相配的方式编写Foo.NewestBarValueIs

0 个答案:

没有答案