我已经读了约一个小时的关于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
在这里不起作用。有人可以解释表达式的工作原理以及如何使它工作吗?
答案 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}
中直接定义)