6

我有这 4 个复选框,它们构成了字符串变量 saljes、kopes、bytes、erbjudes。当它们被检查时,它们会得到“on”的值。

由此我将一个字符串变量 (p) 放在一起,其中包含我想要包含在 LINQ 语句中的所有数字。假设如果所有复选框都被选中,我会得到一个字符串“1234”,如果只选中复选框 2 和 4,它将导致“24”。

在我的数据库中,我有一个名为“Type”的字段,其类型为 int。我想告诉数据库包含可以在字符串 p 中找到的具有“类型”值的所有行。

像这样的东西(当然我的代码不起作用,因此我需要你们):

        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(),但是怎么做呢?

4

3 回答 3

3

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

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

p是字符串,包含(字符串值)需要字符串作为参数,所以你不需要 lambda 表达式。

于 2012-04-25T13:42:00.263 回答
1

Contains()已经是“反向输入”,如此所述:

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));
于 2012-04-25T13:34:31.813 回答
1

这个表情能做到吗?

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

例如 if s.Typeis24pis "234"thens.Type包含在字符串中。如果我们将 转换int为 char-array 我们得到

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

于 2012-04-25T13:43:58.917 回答