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”,并且有不止一个Michael出资,它只会显示第一个Michael的搜索结果。

那么,我该怎么办呢?我一直在谷歌搜索几天,我还没有找到一个解决方案,返回与多个出版物和多个作者的部分视图。任何人都有解决方案?

+0

因此,您希望获得与您的'searchAuthor'匹配的所有作者的所有出版物? –

+0

对不起,不完全匹配,但包含名称中的字符串。 – clevergrant

回答

3

你需要切换您的p.Authors.ToList().Contains(auth[0]),以便它使用由auth

像这样的东西回到应该工作的所有值:

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