【问题标题】:How can I create a conditional where clause using LINQ [duplicate]如何使用 LINQ 创建条件 where 子句 [重复]
【发布时间】:2015-08-27 23:21:24
【问题描述】:

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

例如:

如果字符串名称 = "";

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

如果字符串名称 = "satya";

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

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

【问题讨论】:

  • .toList() 应该是 .ToList()。但是话又说回来,除非你真的需要一个列表,否则它根本不应该在那里;枚举直接削减创建一个列表,然后枚举它。

标签: c# .net entity-framework linq linq-to-entities


【解决方案1】:

我认为您可以使用代码 sn-p 2 来获得与代码 sn-p 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

【讨论】:

  • 我在我的示例代码中尝试了这个,它工作正常。您的意思是“”为空,而不是null
【解决方案2】:

以下应该可行,您可以按照自己喜欢的方式对其进行调整以达到所需的结果。只迎合空/null字符串或名称包含在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()

在文本板上创建的,可能存在小的语法问题。

【讨论】:

    【解决方案3】:

    你可以这样做:

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

    【讨论】:

    • 感谢您的评论,但是当我使用 ToList() 时出现超时异常,因为它有一些千万条记录。虽然它正在获取记录,但我遇到了异常,但是如果我直接使用 If else 单独的查询编写查询,我没有得到那个异常。
    • 由于连接超时而发生超时,该连接保持与数据库的实时连接,当您尝试获取 IQueryable 类型时,选项将增加连接超时,默认为 60 秒或将数据带入内存并对其进行处理,这就是您在 if 循环中所做的事情。无论如何,每次调用处理这些数据都是疯狂的
    猜你喜欢
    • 2023-03-20
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多