我的控制器中有以下代码,它获得了多个单词搜索的第一个结果。与此问题的答案类似:ASP:NET MVC multiple words in search
var items = from s in db.Items select s;
if (!string.IsNullOrEmpty(searchString) && !searchString.Any(x => Char.IsWhiteSpace(x)))
{
searchString.Trim();
items = items.Where(s => s.keywords.Contains(searchString) || s.notes.Contains(searchString)
}
else if (!string.IsNullOrEmpty(searchString) && searchString.Any(x => Char.IsWhiteSpace(x)))
{
searchString.Trim();
string[] strings = searchString.Split(' ');
var finalItems = new List<Items>();
foreach (var splitString in strings)
{
finalItems.Add(items.FirstOrDefault(s => s.notes.Contains(splitString)
|| s.keywords.Contains(splitString));
}
items = finalItems.ToList().AsQueryable();
return View(items.ToPagedList(pageNumber, pageSize));
}
我希望得到所有匹配的结果,而不是第一场比赛。现在,当我尝试将.FirstOrDefault行更改为:
时finalItems.Add(items.Where(s => s.notes.Contains(splitString)
|| s.keywords.Contains(splitString)
我得到&#39;无法转换为System.Linq.IQueryable(MyProject.Models.Items)&#39;到&#39; MyProject.Models.Items 。
我已尝试将我的项目分配更改为:
var items = from s in db.Items
select s as IQueryable(Items);
这似乎解决了这个问题,但后来它打破了我所有的s.keywords.Contains或s.notes.Contains,错误&#39; IQueryable(Items)不包含关键字或注释的定义没有可以找到接受类型为IQueryable(Items)的第一个参数的扩展方法关键字或注释&#39; 。
答案 0 :(得分:2)
FirstOrDefault()
只返回某种类型的一个元素(在您的情况下为MyProject.Models.Items
)或null
。
Where()
返回项目集合。
Add()
方法需要MyProject.Models.Items
- 一个元素,而不是集合。
您应该使用AddRange()
添加集合:
finalItems.AddRange(items.Where(s => s.notes.Contains(splitString)
|| s.keywords.Contains(splitString);