我有这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(),但是如何?
答案 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.Type
为24
且p
为"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子句。因此,必须扫描整个表格。