我有一个简单的Person View Model
public class PersonViewModel
{
public int ID {get;set;}
public String FirstName {get;set;}
public String LastName {get;set;}
}
视图有三个字段
我在我的PersonService
中使用了这个函数,它使用了一个被注入的EF6 datacontext。
public IQueryable<Person> Search(Expression<Func<Person,bool>> predicate)
{
return dataContext.GetSet<Person>().Where(predicate);
}
现在我的MVC控制器实际上使用PersonViewModel class
[HttpPost]
public ActionResult Search(PeopleSearchViewModel model)
{
if (ModelState.IsValid)
{
var listOfPersons= PersonService.Search(
//map viewmodel to model and search here)
//return the list and render a view etc...not important
}
}
所以我想知道的是,如果我能以某种方式获取PersonViewModel,创建一个Func<Person,bool>
谓词并将其传递给PersonService
进行搜索,而不是使用automapper来映射是否是一个好主意我的视图模型到域模型?
由于
答案 0 :(得分:2)
首先,您将类型Func作为谓词传递给返回IQueryable的函数。您实际上应该传入Expression<Func<Person, bool>>
,以便生成查询的任何内容实际上都可以将函数作为表达式树检查并从中生成SQL或其他内容。如果你不这样做,你的查询生成器可能会最终加载你的整个表并手动迭代(在实体框架中看到这种情况一次)。
回答你的答案:我会在你的PeopleSearchViewModel
上执行一项功能:
public Expression<Func<Person, bool>> ToExpression()
{
//this can be whatever your search query needs to be... I just did this quick and dirty
return p => p.FirstName == this.FirstName || p.LastName == this.LastName || p.ID == this.ID;
}
然后,只需将调用model.ToExpression()
的结果传递给搜索功能。