【问题标题】:Retrieving all records with Lambda StartsWith()使用 Lambda StartsWith() 检索所有记录
【发布时间】:2016-09-25 17:08:59
【问题描述】:

我有以下 ActionResult 并检索以“查询”参数值开头的记录。但是,当查询值为空或 null 时,方法不返回任何记录,而我想检索所有记录。那么,我是否必须使用 if 子句并创建不同的 lambda 子句,或者是否可以使用 StartsWith 检查查询参数并检索所有记录?

public ActionResult StudentLookup(string query)
{
    var students = repository.Students.Select(m => new StudentViewModel
    {
        Id = m.Id,
        Name = m.Name
    })
    .Where(m => m.Name.StartsWith(query));
    return Json(students, JsonRequestBehavior.AllowGet);
}

【问题讨论】:

  • 你也可以使用Where(m=>(m.Name ??"").StartsWith(query));实现同样的目的

标签: c# asp.net asp.net-mvc linq lambda


【解决方案1】:

嗯,有两个选择:

  • 有条件地应用Where 子句:

    IQuerable<StudentModel> students = repository.Students.Select(m => new StudentViewModel
    {
        Id = m.Id,
        Name = m.Name
    });
    if (!string.IsNullOrEmpty(query))
    {
         students= students.Where(m => m.Name.StartsWith(query));
    }
    return Json(students, JsonRequestBehavior.AllowGet);
    
  • 将检查放在Where 子句本身中:

    var students = repository.Students.Select(m => new StudentViewModel
    {
        Id = m.Id,
        Name = m.Name
    })
    .Where(m => string.IsNullOrEmpty(query) || m.Name.StartsWith(query));
    return Json(students, JsonRequestBehavior.AllowGet);
    

【讨论】:

  • IQueryable 上没有 ToList()ToArray() 调用?
  • @Shyju:呃,不……为什么需要?我希望Json 调用只评估一次。 (除非这是我不知道的Json 调用的一些限制......)
  • @binary:嗯,您通常会使用它们来急切地实现查询,例如不止一次地迭代它,或者传递给你不知道它会对结果做什么的其他东西。
  • @binary 我确定您更喜欢第二种方法,但请记住,您的数据库会更喜欢第一种方法 :)
  • @binary:第一个的性能至少应该和第二个一样好,并且可能会更好。但我们无法确定会有多大差异,也无法确定它在您的特定应用中是否显着。不过,您可以确定这一点,而且您应该这样做。
猜你喜欢
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 2014-02-03
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多