2012-04-25 40 views
6

我有這4個複選框,構成字符串變量saljes,kopes,字節,erbjudes逆轉。當他們被檢查時,他們會得到「開啓」的值。包含(),如何使用lambda

從這個我放在一起,它包含所有我想在LINQ的語句,以包括數字的字符串變量(P)。 假設所有複選框都被選中,我會得到一個「1234」的字符串,如果僅選中複選框2和4,則會導致「24」。

在我的數據庫我有一個名爲「類型」字段是int類型的。我想告訴數據庫包含所有具有可以在字符串p中找到的「Type」值的行。

像這樣的東西(當然,我的代碼不能正常工作,所以我需要你們):

 var searchResult = from s in db.Ads select s; 
     string p = "1"; 

     if (saljes != "on") 
      p = p.Replace("1", ""); 
     if (kopes == "on") 
      p += "2"; 
     if (bytes == "on") 
      p += "3"; 
     if (erbjudes == "on") 
      p += "4"; 

     searchResult = searchResult.Where(s => p.Contains(s => s.Type.ToString()); 

我還挺需要做的是相反的載有(),但如何?

+0

你不能使用IEnumerable p'?如果你需要它,你總是可以用'String.Join'加入它,但是可以讓你更多地控制獲取單個值。另一個選擇是使用位:'Int32 p;'和測試'(p&1)','(p&4)'等。 – 2012-04-25 13:31:09

+0

所以如果你的字符串是「234」,那麼值爲「24」應該在你的數據庫中找到? – 2012-04-25 13:32:46

+1

您的問題對我來說有點不清楚 - 查看幾個您希望針對各種「類型」值發生的示例會很有用。 – 2012-04-25 13:35:27

回答

1

Contains()已經是 '逆轉',如所描述here

int[] productList = new int[] { 1, 2, 3, 4 }; 

var myProducts = from p in db.Products 
       where productList.Contains(p.ProductID) 
       select p; 

所以只需填寫一個列表:

var list = new List<int>(); 

if (saljes == "on") 
    list.Add(1); 
if (kopes == "on") 
    list.Add(2); 
if (bytes == "on") 
    list.Add(3); 
if (erbjudes == "on") 
    list.Add(4); 

var searchResult = db.Ads.Where(s => list.Contains(s.Type)); 
+1

非常感謝!雖然我不得不修改一下代碼。如果我在Contains()中嘗試了lambda表達式,它會說「不能將lambda表達式轉換爲int類型,因爲它不是委託類型」。雖然如果我只寫searchResult = searchResult.Where(s => list.Contains(s.Type));它工作正常。 – 2012-04-25 13:48:05

3

不清楚是什麼問題,但這應該工作:

searchResult = searchResult.Where(s => p.Contains(s.Type.ToString()); 

p是字符串和Contains(string value)期望字符串作爲參數,所以你不需要lambda表達式。

1

這個表達式能做到嗎?

s => s.Type.ToString().ToCharArray().Except(p.ToCharArray()).Count() == 0 

例如,如果s.Type24p"234"然後s.Type包含在的字符串中。如果我們轉換int爲char數組,我們得到

{'2', '4'} 

的字符串轉換成字符數組是

{'2', '3', '4'} 

這意味着int的數字都包含在string。因此int數字除了string數字產生一個空集,我們用Count() == 0進行測試。

{'2', '4'}.Except({'2', '3', '4'}) ==> { } 

而不是創造一個string的,我會創造一個List<char>

var p = new List<char>();    

if (saljes == "on") p.Add('1');    
if (kopes == "on") p.Add('2');    
if (bytes == "on") p.Add('3');    
if (erbjudes == "on") p.Add('4');    

則表達式變得

s => s.Type.ToString().ToCharArray().Except(p).Count() == 0 

但要注意的是,這不可能轉換爲適當的SQL-where子句。因此整個表格必須被掃描。