获取IQueryable中的所有结果,而不是.FirstOrDefault

时间:2017-08-04 09:39:02

标签: c# linq model-view-controller

我的控制器中有以下代码,它获得了多个单词搜索的第一个结果。与此问题的答案类似: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;

1 个答案:

答案 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);