如何使用LINQ [duplicate]创建条件where子句

问题描述 投票:9回答:3

这个问题在这里已有答案:

我有一个场景,我只想在必要时使用WHERE子句,否则我只想在没有WHERE子句的情况下运行我的LINQ查询。

例如:

if string name =“”;

var res = (from a in db.person 
           select new() { Name = a.FullName, DOB = a.DOB }).ToList();

如果string name =“satya”;

var res = (from a in db.person
           where a.person.contains(name)
           select new() { Name = a.FullName, DOB = a.DOB }).ToList();

我知道为此我们必须分别编写单独的2个查询,但是如果不编写单独的查询,我们如何将它们组合成单个查询?

c# .net entity-framework linq linq-to-entities
3个回答
20
投票

你可以做:

var res = (from a in db.person
           where name == "" || a.person.Contains(name)
           select new { Name = a.FullName, DOB = a.DOB }
          ).ToList();

或者,在这里使用流畅的语法,您可以构建您的查询并在完成后执行它:

var query = db.person.AsQueryable();

if(!String.IsNullOrEmpty(name)) {
    query = query.Where(a => a.person.Contains(name));
}

var result = query.Select(s => new { Name = s.FullName, DOB = s.DOB })
                  .ToList();

1
投票

以下应该可以工作,您可以按照您希望的方式调整它以达到预期的效果。只满足空/空字符串的条件或者名称包含在a.person中,其余全部将导致null,我们最后过滤

db.person.Select(a => {
    if ( String.IsEmptyOrNull(name) || a.person.contains(name))
        return new {Name=a.FullName,DOB=a.DOB};
    else
        return null;
    }
).Where(x => x != null).ToList()

在文本板上创建它,可能会有一些小的语法问题。


0
投票

我认为你可以使用代码片段2来​​获得与代码片段1相同的结果,甚至名称包含字符串为空。为什么你应该制作2个不同的代码。这是性能问题吗?

var res = (from a in db.person
where a.person.contains(name)  // if empty, it will return all list, just makes sure it's not null before
select new(){Name=a.FullName,DOB=a.DOB}).toList();

我在我的示例代码上尝试这个,它工作正常

static void TestContains()
{
    IList<CustomEntity> _a = new List<CustomEntity>();
    IList<CustomEntity> _b = new List<CustomEntity>();

    _a.Add(new CustomEntity { ID = 1, Code = "a", Description = "aaa" });
    _a.Add(new CustomEntity { ID = 2, Code = "c", Description = "c" });

    string name = string.Empty;
    _b = _a.Where(a => a.Description.Contains(name)).ToList();

    foreach (CustomEntity temp in _b)
    {
        Console.WriteLine(temp.Description);
    }
}

这将是结果

aaa
c
© www.soinside.com 2019 - 2024. All rights reserved.