【问题标题】:How to write LINQ IN clause query which will work as LIKE operator as well?如何编写也可以用作 LIKE 运算符的 LINQ IN 子句查询?
【发布时间】:2012-05-31 08:03:33
【问题描述】:

我们如何为以下 select sql 查询编写 LINQ 查询:

string brandid="1,2,3"
string bodystyleid="1,2,3"
-------------------
-----------------

select * from car
where brandid in (brandid)
and bodystyleid in (brandid)
----------------------
-------------------

我的具体要求是如果brandid或bodystyleid为空(如果用户没有选择 特定搜索选项的任何复选框)查询应返回该特定 where 条件的所有记录。

请指导我。

谢谢,

保罗

【问题讨论】:

    标签: linq entity-framework linq-to-entities sql-like in-clause


    【解决方案1】:

    为了满足您在未指定任何商品的情况下退回所有商品的要求,您需要检查列表是否为空。

    var brands = brandid.Split(',').Select(x => Int32.Parse(x));
    var styles = bodystyleid.Split(',').Select(x => Int32.Parse(x));
    
    var result = from c in car
                 where (!brands.Any() || brands.Contains(c.brandid))
                      && (!styles.Any() || styles.Contains(c.bodystyleid))
                 select c;
    

    (类似于 sgmoore 的解决方案,但包括检查未指定品牌/样式)

    我实际上并没有检查它是如何转换回 SQL 的 - 使用标志来指示是否有任何值可能更有效:

    var brands = ....;   // As above
    bool anyBrands = brands.Any()
    var result = from c in car
                 where (!anyBrands || brands.Contains(c.brandid))
                   .....
    

    【讨论】:

    • 感谢它对我有用。在这种情况下,您能否建议我在性能方面编写存储过程或使用 LINQ 哪个会更好?
    • @Paul - 自己看,运行Sqlserver的trace工具看看生成了什么SQL,然后看看能不能写出更好的SQL。选择具有更好性能或执行计划的方案。
    【解决方案2】:

    bodystyleid 是用来检查brandid 还是bodystyleid? (我假设bodystyleid,但是已经编写了查询以匹配问题中的查询(brandid))

    一开始你可以这样做:

    var results = (from c in car
                   where c.brandid.Contains(brandid)
                   && c.bodystyleid.Contains(brandid)
                   select c).ToList();
    

    【讨论】:

      【解决方案3】:
      var brandids     = brandid    .Split(',').Select(n => int.Parse(n)).ToList();
      var bodyStyleids = bodystyleid.Split(',').Select(n => int.Parse(n)).ToList();
      
      
      var results =
          (from c in car where 
            brandids.Contains(c.brandid) && 
            bodyStyleids.Contains(c.bodystyleid) 
           select c
         ).ToList();
      

      【讨论】:

        【解决方案4】:

        您拥有的Ids 是带有逗号分隔符的字符串,您需要它们是与Car 表的Ids 相同类型的List 之类的集合,所以如果brandid 列是int 那么brandids 必须是List<long>,那么你可以这样做

        var results = (
            from c in cars
            where brandids.Contains(c.brandid) && bodystyleid.Contains(c.bodystyleid) 
            select c).ToList();
        

        【讨论】:

          猜你喜欢
          • 2021-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多