2017-08-04 81 views
1

我的控制器中有以下代码,它获取多个词搜索的第一个结果。类似于这个问题的答案:ASP:NET MVC multiple words in search获取IQueryable中的所有结果,而不是.FirstOrDefault

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) 

我得到一个System.Linq.IQueryable(MyProject.Models.Items)“不能将‘’到” MyProject.Models.Items

我试图改变我的项目分配:

var items = from s in db.Items 
        select s as IQueryable(Items); 

这似乎解决了问题,但随后它打破了我所有的s.keywords.Contains或s.notes.Contains与错误“的IQueryable (Items)不包含关键字或注释的定义,并且没有可以找到接受IQueryable(Items)类型的第一个参数的扩展方法关键字或注释'

+0

随着'FirstOrDefault()'你喜欢的方法的名字说1项或没有。当你想要获得像'Where()'这样的超过1个项目时,你可以找到一个Collection。现在你必须改变你的所有方法,他们可以处理一个物品集合,而不仅仅是一个物品 – Yggraz

回答

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); 
相关问题