0

私は学術出版物を持つデータベースを持っていますが、それらはすべて複数の著者を持っています。私は複数のフィルタを同時に使用するように設計された複数のフィルタリングオプションを備えた、これらのパブリケーションのページされた部分的なビューを表示するページを持っています。MVC 5 C#多対多のリレーショナルデータベースを検索

私は他のフィルタリングオプションをすべてうまく実装できましたが、私に問題を起こしているのは著者によるフィルタで、ユーザは著者の名前を入力して任意の出版物を返すことができますその著者から。

それは、コード最初のデータベースだし、出版物のモデルがこれを含んでいます

public virtual ICollection<Author> Authors { get; set; } 

と同様に、著者のモデルに:今

public virtual ICollection<Publication> Publications { get; set; } 

、私は部分を返すコントローラを持っています次のように表示されます:

Models.Author[] auth = db.Authors.Where(p => p.FullName.ToLower() 
    .Contains(searchAuthor).ToLower())).ToArray(); 

return PartialView("_PublicationList", await db.Publications 
    .Where(p => p.Authors.ToList().Contains(auth[0])).ToListAsync()); 

ここで、「searchAuthor」はビューのテキストボックスの値です(私はl単純化のために他のフィルタを省略している)。

ご覧のとおり、これは一致する最初の著者のみを検索します。誰かが "Michael"と入力し、貢献したマイケルが複数いる場合、最初のマイケルの検索結果のみが表示されます。

これはどうすればいいですか?私は数日間Googleを検索していましたが、複数の出版物や複数の著者が部分的な見解を返すための解決策は見つかりませんでした。誰にでも解決策がありますか?

+0

あなたはあなたの 'searchAuthor'と一致するすべての著者のすべての出版物を取得したいですか? –

+0

申し訳ありませんが、正確には一致しませんが、名前に文字列が含まれています。 – clevergrant

答えて

3

あなたはそれがauth

によって返されたすべての値がこのような何かが動作するはず使用するように、あなたのp.Authors.ToList().Contains(auth[0])を切り替える必要があります。英語で

return PartialView("_PublicationList", await db.Publications 
.Where(p => p.Authors.Any(a => auth.Contains(a)).ToListAsync()); 

を:「その出版物の一覧出版物のリストを著者はsearchAuthorリストに一致しています "

+0

本当の答えは、この答えが正しいと思ったので削除されました。しかし、最終的なコードは若干異なります。 'auth'変数は必要ありませんでした。この答えは、この問題を探している人にとって誤解を招きます。正解は私が後で投稿したもので、次のコードを持っています: '。.Where(p => p.Authors.Any(a => a.name.Contains(searchAuthor))) – clevergrant

関連する問題