包含(),如何使用lambda反转

时间:2012-04-25 13:23:21

标签: c# model-view-controller linq-to-sql lambda

我有这4个复选框,它们构成字符串变量saljes,kopes,bytes,erbjudes。检查它们后,它们会得到“打开”的值。

从这里我把一个字符串变量(p)放在一起,其中包含我想要包含在LINQ语句中的所有数字。 假设如果选中所有复选框,我会得到一个“1234”字符串,如果只选中复选框2和4,则会产生“24”。

在我的数据库中,我有一个名为“Type”的字段,其类型为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());

我需要做的是反转Contains(),但是如何?

3 个答案:

答案 0 :(得分:3)

不清楚问题是什么,但这应该有效:

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

p是字符串,Contains(string value)期望字符串作为参数,因此您不需要lambda表达式。

答案 1 :(得分:1)

Contains()已经是'逆转IN',如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));

答案 2 :(得分:1)

这个表达式能做到吗?

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

E.g。如果s.Type24p"234",则s.Type包含在字符串中。如果我们将int转换为char数组,我们得到

{'2', '4'}

转换为char数组的字符串是

{'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子句。因此,必须扫描整个表格。