2012-05-24 30 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();