2012-05-24 28 views
4

我们如何可以写一个LINQ查询下面选择SQL查询:如何编写将作为LIKE运算符工作的LINQ IN子句查询?

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

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

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

请指引我。

感谢,

保罗

回答

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

感谢它为我工作。在这种情况下,请您建议我写性能明智的存储过程还是使用LINQ哪个更好? – Paul

+0

@Paul - 自己看看,运行Sqlserver的跟踪工具来查看生成了什么SQL,然后看看你是否可以编写更好的SQL。去与任何有更好的表现或执行计划。 – gbjbaanb

2

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

作为开始,你可以这样做:

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

Id是你必须是与逗号串分隔符,你需要他们喜欢同一类型的List作为Id S中Car表的集合,因此,如果brandid列为int然后brandids必须是List<long>,那么你可以做

var results = (
    from c in cars 
    where brandids.Contains(c.brandid) && bodystyleid.Contains(c.bodystyleid) 
    select c).ToList(); 
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();