【问题标题】:Combine "WHERE" queries with LINQ将“WHERE”查询与 LINQ 相结合
【发布时间】:2019-02-13 16:40:59
【问题描述】:

在常规 SQL 中,我可以编写类似

的查询

select * from geocodes where NAME='somename' and STATE='somestate'

但在 LINQ 中,我无法弄清楚如何做到这一点。我想为我正在使用 LINQ 执行的以下单个查询编写一些组合查询:

if (!String.IsNullOrEmpty(searchString))
        {
            switch (searchBy)
            {
                case "Name":
                    geocodes = geocodes.Where(s => s.NAME.Contains(searchString));
                    break;
                case "Site":
                    geocodes = geocodes.Where(s => s.CFN_SITE.Contains(searchString));
                    break;
                case "Address":
                    geocodes = geocodes.Where(s => s.STREET1.Contains(searchString));
                    break;
                case "City":
                    geocodes = geocodes.Where(s => s.CITY.Contains(searchString));
                    break;
                case "State":
                    geocodes = geocodes.Where(s => s.STATE_CODE.Contains(searchString));
                    break;
                case "Acct":
                    geocodes = geocodes.Where(s => s.AccountNumber.Contains(searchString));
                    break;
            }

        }

【问题讨论】:

  • geocodesIQueryable 吗?您在此处显示的代码有什么问题?
  • 为什么不在条件中使用&&?您是否尝试动态构建 Where 条件?
  • 如果您删除 switch 并为每种情况使用if (shouldThisConditionBeUsed),您将获得一个动态生成的Where(..).Where(..) 调用序列,相当于&&
  • 删除 switch 语句是一个有趣的提议。我可以试试!

标签: c# sql entity-framework linq


【解决方案1】:

使用&& 逻辑与运算符:

geoCodes = geoCodes.Where(s => s.Name.Contains(someName) && s.State.Contains(someState));

【讨论】:

    【解决方案2】:

    如果geocodesIQueryable<>,那么您可以利用创建可查询对象时的延迟执行。您的代码可能如下所示:

    if(searchByName) //Some boolean value to indicate you are searching the name
    {
        geocodes = geocodes.Where(s => s.NAME.Contains(searchString));
    }
    
    if(searchBySite)
    {
        geocodes = geocodes.Where(s => s.CFN_SITE.Contains(searchString));
    }
    
    if(searchByAddress)
    {
        geocodes = geocodes.Where(s => s.STREET1.Contains(searchString));
    }
    
    //etc...
    

    您的查询实际上不会发送到数据库,因为您只是在构建它。只有当您通过枚举结果(通过调用ToList() 或只是循环遍历它)来具体化数据时,Entity Framework 才会构建它需要的 SQL

    【讨论】:

    • 这是否类似于指示使用“IF”语句构建多方面 WHERE 查询的注释?那么查询在什么时候被执行呢?本质上,我可以使用它在逻辑中一次构建多个过滤器?
    • 是的,这与使用 if 语句构建相同,是的,这是构建 EF 查询的常见模式。
    猜你喜欢
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多