2017-08-04 7 views
1

私のコントローラには、複数の単語を含む検索の最初の結果を取得する次のコードがあります。この質問への回答と同様に:ASP:NET MVC multiple words in searchすべての結果を.FirstOrDefaultではなくIQueryableで取得します

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) 

私ははMyProject.Models.Items「から 『System.Linq.IQueryable(MyProject.Models.Items』)から変換することはできません」を取得します。

私は私の項目の割り当てを変更しようとしました:

問題を解決するようだが、それは誤り 「はすべての私のs.keywords.Containsまたはs.notes.Containsを壊す
var items = from s in db.Items 
        select s as IQueryable(Items); 

のIQueryable (Items)にはキーワードまたは注釈の定義が含まれておらず、拡張メソッドのキーワードまたはIQueryable(Items)型の最初の引数を受け入れる注釈は ''となります。

+0

を。 'Where()'でコード化されたような1つ以上のアイテムを取得したいときは、Collectionを返す。今度は、すべてのメソッドを変更しなければならず、アイテムのコレクションを扱うことができます。 – Yggraz

答えて

2

FirstOrDefault()は、あるタイプの要素(あなたの場合はMyProject.Models.Items)またはnullを返します。

Where()は、アイテムのコレクションを返します。

Add()メソッドが予期していますMyProject.Models.Items - コレクションではなく1つの要素。

あなたは、コレクションに追加するAddRange()を使用する必要があります:メソッドの名前は、1つの項目または何も言うように、 `あなたが得る)` FirstOrDefault(で

finalItems.AddRange(items.Where(s => s.notes.Contains(splitString) 
        || s.keywords.Contains(splitString); 
関連する問題