带有包含和可空值的Linq查询

时间:2011-04-08 14:27:49

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

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

public IEnumerable<Result> Search(string searchText)
{

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

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

我试过这个没有运气:

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

还有另一种方法可以实现这一点,除了将其分解为两个步骤并在将if语句应用于查询之前在if语句中检查searchString吗?

7 个答案:

答案 0 :(得分:4)

_context.Person.Where(x => string.IsNullOrEmpty(searchText) ? true : x.Contains(searchText));

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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));
    }

答案 3 :(得分:0)

你可以这样做:

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

这是一个我使用的模式,当我有参数时我只想设置它们。

答案 4 :(得分:0)

效率较低的方式......不确定这是否在语义上是正确的,但你明白了......

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

答案 5 :(得分:0)

假设Person是一个类Contains似乎是这个类的方法。像Where(x => x.Contains(searchText))Where(x => 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 => string.IsNullOrEmpty(searchText) || x.Name.Contains(searchText))会起作用。

答案 6 :(得分:0)

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

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

Issues