2012-04-25 83 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子句。因此整个表格必须被扫描。