如何编写LINQ IN子句查询,它也可以作为LIKE运算符使用?

时间:2012-05-24 17:35:34

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

我们如何为以下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为空(如果用户没有选择 任何特定搜索选项的复选框)查询应该返回该特定条件的所有记录。

请指导我。

谢谢,

4 个答案:

答案 0 :(得分:6)

为了满足您关于返回所有项目的要求(如果没有指定),您需要检查列表是否为空。

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))
               .....

答案 1 :(得分:2)

bodystyleid是否意味着检查brandid或bodystyleid? (我假设是bodystyleid,但是已经编写了查询以匹配问题中的查询(brandid))

首先,您可以这样做:

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

你拥有的Id是带逗号分隔符的字符串,你需要它们是List的集合,其类型与Id的{​​{1}}相同表格,如果Car列为brandid,则int必须为brandids,那么您可以

List<long>