【问题标题】:How to convert a simple viewmodel to Func<T,bool> predicate?如何将简单的视图模型转换为 Func<T,bool> 谓词?
【发布时间】:2014-10-26 21:42:46
【问题描述】:

我有一个简单的Person View Model

public class PersonViewModel
{
    public int ID {get;set;}
    public String FirstName {get;set;}
    public String LastName {get;set;}
}

视图包含三个字段

我的PersonService 中有这个函数,它使用注入的 EF6 数据上下文。

 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&lt;Person,bool&gt; 谓词并将其传递给 PersonService 进行搜索,而不是使用 automapper 将我的视图模型映射到领域模型?

谢谢

【问题讨论】:

  • 它将无法正常工作,因为您将Func&lt;&gt; 发送到Where 方法,然后所有过滤都将在.Net 端完成,整个表将从坏的DB 加载。应该是Expression&lt;Func&lt;Person, bool&gt;&gt;
  • 对不起,我错过了,我已经更新了代码——虽然我不确定这是否是你的意思。
  • 是的,我是认真的。嗯,Search 方法用于过滤。它不需要Person 类的真实实例,那么你的问题是什么?您想使用PersonSearchViewModel 进行Search 过滤吗?

标签: c# linq


【解决方案1】:

首先,您将类型 Func 作为谓词传递给返回 IQueryable 的函数。您实际上应该传入Expression&lt;Func&lt;Person, bool&gt;&gt;,以便生成查询的任何内容都可以将函数实际检查为表达式树并从中生成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() 的结果传递给您的搜索函数。

【讨论】:

  • +1 这看起来与我的想法一模一样,但正如我在问题中提到的那样,我忽略了任何明显的缺点吗?
  • 如果您的搜索模型或人员模型发生更改,它确实需要手动修改,但无论如何您都必须处理这个问题,除非您最终使用某种映射器库。但这应该是唯一的主要问题......我一直使用这种模式
  • 谢谢...尝试创建此 ToExpression 函数的通用版本是否不合理?还是我必须为每个视图模型创建一个?
猜你喜欢
  • 2021-06-17
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 2013-03-09
相关资源
最近更新 更多