EF6 OrderBy抽象类中的通用表达式

时间:2018-10-17 15:17:16

标签: c# linq entity-framework-6

我已经读了约一个小时的关于Expression<Func<TModel,TResult>>的帖子,但我真的不明白。我道歉,但我没有。

我有一个问题,我有一个抽象类,该抽象类具有对EF6的调用,在这里需要按我想在子类中定义的某些属性进行排序。也就是说,我将在下面添加一个示例。

public abstract MyController<TModel>:ApiController
{
     protected IRepository<TModel> Repository {get;}

     protected MyController(IRepository<TModel> repo)
     {
         Repository = repo;
     }

     protected Expression<Func<TModel,TResult>> OrderBy {get; set}

     public IHttpActionResult GetItems()
     {
        return Ok(Repository.Get().OrderBy(x=>OrderBy(x)).ToList()); //with lots of other cool stuff.
     }

}

public PersonController:MyController<Person>
{
    public PersonControler(IRepository<Person> repo):base(repo)
    {
        OrderBy = //I need help here
    }   

}

好的,所以在所有这些之后,我一直在阅读有关表达式的信息,但我不明白为什么OrderBy = (person)=> person.LastName在这里不起作用。有人可以解释表达式的工作原理以及如何使它工作吗?

2 个答案:

答案 0 :(得分:1)

将您的财产声明为

protected Expression<Func<TModel, object>> OrderBy { get; set; }

PersonController中分配

OrderBy = p => p.LastName

并像使用它

Repository.Get().OrderBy(OrderBy).ToList()

答案 1 :(得分:0)

在(EF / LINQ查询翻译引擎的)幕后,Expression(实际上是所有方法调用链)被翻译为SQL查询。有表情访问者(请参见模式“访客”)可以完成工作。

要使工作正常进行,
Get的方法IRepository应该返回类型DbSet<TModel>(对于EF)或Table<TModel>(对于LINQ to SQL)
排序键的类型应在抽象类(public abstract MyController<TModel, TKey> : ApiController)中定义,或在表达式(protected Expression<Func<TModel, int>> OrderBy {get; set}中直接定义)