【发布时间】:2009-12-08 13:02:45
【问题描述】:
以下 LINQ 语句:
public override List<Item> SearchListWithSearchPhrase(string searchPhrase)
{
List<string> searchTerms = StringHelpers.GetSearchTerms(searchPhrase);
using (var db = Datasource.GetContext())
{
return (from t in db.Tasks
where searchTerms.All(term =>
t.Title.ToUpper().Contains(term.ToUpper()) &&
t.Description.ToUpper().Contains(term.ToUpper()))
select t).Cast<Item>().ToList();
}
}
给我这个错误:
System.NotSupportedException:本地 序列不能在 LINQ to SQL 中使用 查询运算符的实现 除了 Contains() 运算符。
环顾四周,似乎我唯一的选择是将所有我的项目首先放入一个通用列表,然后对其进行 LINQ 查询。
或者有没有巧妙的方法改写上面的LINQ-to-SQL语句来避免错误?
回答:
感谢 Randy,您的想法帮助我构建了以下解决方案。它并不优雅,但它解决了问题,因为这将是代码生成,我可以处理例如20 个搜索词,无需任何额外工作:
public override List<Item> SearchListWithSearchPhrase(string searchPhrase)
{
List<string> searchTerms = StringHelpers.GetSearchTerms(searchPhrase);
using (var db = Datasource.GetContext())
{
switch (searchTerms.Count())
{
case 1:
return (db.Tasks
.Where(t =>
t.Title.Contains(searchTerms[0])
|| t.Description.Contains(searchTerms[0])
)
.Select(t => t)).Cast<Item>().ToList();
case 2:
return (db.Tasks
.Where(t =>
(t.Title.Contains(searchTerms[0])
|| t.Description.Contains(searchTerms[0]))
&&
(t.Title.Contains(searchTerms[1])
|| t.Description.Contains(searchTerms[1]))
)
.Select(t => t)).Cast<Item>().ToList();
case 3:
return (db.Tasks
.Where(t =>
(t.Title.Contains(searchTerms[0])
|| t.Description.Contains(searchTerms[0]))
&&
(t.Title.Contains(searchTerms[1])
|| t.Description.Contains(searchTerms[1]))
&&
(t.Title.Contains(searchTerms[2])
|| t.Description.Contains(searchTerms[2]))
)
.Select(t => t)).Cast<Item>().ToList();
default:
return null;
}
}
}
【问题讨论】:
-
请注意,这不是“未实现”错误,而是“无法使用本地序列”错误。
-
我不确定我是否正确阅读了这篇文章,它有很多括号,但我没有看到格式良好的 where 子句。您的 searchTerms.All() 正在返回一个不构成 where 子句的字符串列表,因此会出现错误。
-
searchTerms.All() 只是遍历字符串集合但返回一个 List
- ,这里有一个类似的例子:stackoverflow.com/questions/1866018/…
标签: c# linq linq-to-sql