Asp.net LINQ:如何重写WHERE子句以避免:不能在LINQ to SQL中使用局部序列

Asp.net LINQ:如何重写WHERE子句以避免:不能在LINQ to SQL中使用局部序列,asp.net,linq,linqdatasource,Asp.net,Linq,Linqdatasource,我的Linq查询给出错误:本地序列不能用于查询运算符的Linq到SQL实现中,除了Contains运算符 如何重写它以避免此错误?我相信您可以将字符串列表发送到LINQ to SQL,以获得包含的 我错了。但是你可以做的是做一个巨大的Where子句。如果有很多字符串需要比较,我不建议这样做,但请测试并查看 var strings = TextBox1.Text.Split(' ').ToList(); var query = from product in dc.catalog select p

我的Linq查询给出错误:本地序列不能用于查询运算符的Linq到SQL实现中,除了Contains运算符

如何重写它以避免此错误?

我相信您可以将字符串列表发送到LINQ to SQL,以获得
包含的

我错了。但是你可以做的是做一个巨大的
Where
子句。如果有很多字符串需要比较,我不建议这样做,但请测试并查看

var strings = TextBox1.Text.Split(' ').ToList();
var query = from product in dc.catalog select product;
foreach (var s in strings)
{
    query = query.Where(product => product.Name.Contains(s));
}
return query;
这将创建类似于

 var query = from product in dc.catalog
             where product.Name.Contains(string1)
             where product.Name.Contains(string2)
             where product.Name.Contains(string3)
             // etc
             select product;  
这是非常可怕的,但如果你只有几个字符串,它可能会

<强> Update :为了解释<代码>前缀循环如何工作,请考虑原始查询

 from product in dc.catalog select product
假设您的文本框包含“Hello World”。我将把它分成一个列表,如
{“Hello”,“World”}
,然后迭代该列表

第一个是“你好”。行
query=query.Where(product=>product.Name.Contains))使表达式变为

from product in dc.catalog select product
.Where(product => product.Name.Contains("Hello"))
它还没有被执行-它只是一个表达式树-但是
Where
已经被标记到原始查询上

第二个是“世界”,并附加了表达式

from product in dc.catalog select product
.Where(product => product.Name.Contains("Hello"))
.Where(product => product.Name.Contains("World"))
这与“包含Hello&&World”的含义不同,但在逻辑上是等效的-将测试
产品
以查看其是否包含“Hello”,如果包含“Hello”,则将测试其是否包含“World”。它必须同时包含这两者才能“通过”

这样连接表达式与连接字符串完全相同

var letters = new List<string>(){ "H", "e", "l", "l", "o" };
string result = ""
foreach (var letter in letters)
{
    result = result + letter;
}
var letters=newlist(){“H”、“e”、“l”、“l”、“o”};
字符串结果=“”
foreach(字母中的var字母)
{
结果=结果+字母;
}

result
的值将不是“o”。它将是“Hello”。

正如错误所说,只支持contains。您在中的列表已变成SQL
in
子句。
为了完成您想要的任务,您需要依赖LINQ提供的延迟执行,并构建一个LINQ语句来检查名称中的每个单词

var query = dc.catalog.AsQueryable();
foreach(var s in TextBox1.Text.Split(' ') {
  string copy = s;  // Take a local copy of the string. Lambda's inside loops are fun!
  query= query.Where(product => product.Name.Contains(copy));
}

编辑:获取字符串的本地副本,希望能够绕过lambda上的范围问题。周五下午5点在我脑海中编译,如果仍然不正确,我深表歉意:)

我认为一个简单的方法是对对象执行查询,而不是将其传输到SQL

var query = from product in dc.catalog.ToList()
              where TextBox1.Text.Split(' ').All(s => product.Name.Contains(s))
              select product;

就性能而言,它不是最好的,但这取决于数据源的大小。

@user776676更新了我的答案。我不知道怎么做罢工!但是新的答案应该有用…柯克,关键字的数量是可变的,有时只有1个,有时是3个或4个。如果我能找出如何在查询中为where子句执行foreach,我认为这将解决问题。谢谢。@user776676这个答案不能解决这个问题吗?循环遍历字符串,并为每个字符串添加一个
,其中
。不,Kirk,没有。它只返回字符串中最后一个关键字的记录。正如您在foreach中所看到的,每次迭代后都会重新分配查询,以包含最新的字符串,而我需要所有关键字都出现在记录中。@foreach
query
中的user776676被重新分配给自身加上最新的字符串。每个字符串都有
Where
子句。我扩展了我的答案-你试过这个吗?谢谢,克里斯。我试过了,但是您提出的查询只返回只包含最后一个关键字的记录集。如果TextBox1包含“redtable round”,则返回包含“round”的记录,而我需要包含所有3个关键字的记录。啊,原来的lambda作用域技巧。您将需要复制传递到Where子句中的字符串。我会更新我的答案。@chrissaint最简单的方法是将
拆分
具体化为字符串列表。@chrissaint:你真是个天才!非常感谢!
var query = from product in dc.catalog.ToList()
              where TextBox1.Text.Split(' ').All(s => product.Name.Contains(s))
              select product;