【问题标题】:Linq Query with Contains and Nullable Value具有包含和可为空值的 Linq 查询
【发布时间】:2019-06-29 14:05:29
【问题描述】:

我有一种搜索方法,如下所示:

public IEnumerable<Result> Search(string searchText)
{

     return _context.Person.Where(x => x.Contains(searchText));
}

我希望能够在 searchText 为 null/空的情况下调用此函数并取回所有记录。

我试过这个没有运气:

return _context.Person.Where(x => x.Contains(searchText ?? ""));

除了将其分为两个步骤并在 if 语句中检查searchString 后再将其应用于查询之外,还有其他方法可以实现吗?

【问题讨论】:

  • 相关(但不是您的具体问题):stackoverflow.com/questions/682429/…
  • Contains 是您的 Person 类的方法吗?哪个搜索 FirstName 和 LastName 等?您是如何获得使用 LINQ to Entities 的原始版本 _context.Person.Where(x =&gt; x.Contains(searchText)) 的?你能展示一下这个方法吗?
  • 我明白了,但是示例中的查询类型与您的情况不同。在链接中是像Where(x =&gt; x.City.Contains(searchText)) 这样的查询,它是stringContains 方法(EF 提供程序可以将其映射到SQL 语句),而不是像你看起来的Person 类上的用户定义方法Contains具有。 (上面代码中的xPerson 而不是string。)
  • 哦,对不起,我为了一个简单的例子改变了我的代码。我的代码更像 _context.Person.Where(x => x.LastName.Contains(searchText))

标签: c# linq entity-framework entity-framework-4


【解决方案1】:
_context.Person.Where(x => string.IsNullOrEmpty(searchText) ? true : x.Contains(searchText));

【讨论】:

  • 又好又短的方法。谢谢。
【解决方案2】:
public IEnumerable<Result> Search(string searchText)
{
    if(string.IsNullOrEmpty(searchText))
        return _context.Person;
    else
        return _context.Person.Where(x => x.Contains(searchText));
}

【讨论】:

    【解决方案3】:

    我尝试了所有解决方案,下面的解决方案对我有用

    query = query.Where(e =>  e.CategoryType.HasValue && categoryTypes.Contains(e.CategoryType.Value));
    

    Issues

    【讨论】:

      【解决方案4】:

      你可以这样做:

      return _context.Person.Where(x => 
         string.IsNullOrEmpty(searchText) || 
         x.Contains(searchText)
      );
      

      当我有参数时,我经常使用这种模式,我只想在设置了参数后才应用它们。

      【讨论】:

        【解决方案5】:

        还有一种效率较低的方法...不确定这在语义上是否正确,但您明白了...

        return _context.Person.Where((x, index) => x.Contains(searchText ?? x[index]));
        

        【讨论】:

          【解决方案6】:
          return _context.Person.Where(x =>string.IsNullOrEmpty(searchText) ? true : x.Contains(searchText));
          

          public IEnumerable<Result> Search(string searchText)
              {
                  return string.IsNullOrEmpty(searchText) ? _context.Person : _context.Person.Where(x => x.Contains(searchText));
              }
          

          【讨论】:

            【解决方案7】:

            假设Person 是一个类Contains 似乎是这个类的方法。像 Where(x =&gt; x.Contains(searchText))Where(x =&gt; string.IsNullOrEmpty(searchText) || x.Contains(searchText)) 这样的表达式,其中 x 是一个 Person 将根本不适用于 LINQ to Entities,即使对于像 ...这样的简单类也是如此。

            public class Person
            {
                public int Id { get; set; }
                public string Name { get; set; }
            
                public bool Contains(string searchText)
                {
                    return Name.Contains(searchText);
                }
            }
            

            ...它将引发异常,因为 LINQ to Entities 无法将此方法转换为存储表达式。 Where(x =&gt; string.IsNullOrEmpty(searchText) || x.Name.Contains(searchText)) 会工作。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-10-16
              • 1970-01-01
              • 2014-01-01
              • 1970-01-01
              • 2012-12-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多