MVC 5 C# 搜索多对多关系数据库
MVC 5 C# Search a Many-to-Many Relational Database
我有一个包含学术出版物的数据库,这些出版物都有多个作者。我有一个页面显示这些出版物的分页部分视图,具有多个过滤选项,旨在同时使用多个过滤器。
我已经能够很好地实现所有其他过滤选项,但给我带来麻烦的是作者过滤器,用户可以在其中输入作者姓名,它会 return 该作者的任何出版物。
这是一个代码优先的数据库,发布模型包含:
public virtual ICollection<Author> Authors { get; set; }
同样,在 Author 模型中:
public virtual ICollection<Publication> Publications { get; set; }
现在,我有控制器 return 像这样的局部视图:
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" 是视图文本框中的值(为简单起见,我省略了其他过滤器)。
如您所见,这只会搜索匹配的第一作者。如果有人输入 "Michael",并且有多个 Michael 贡献,它只会显示第一个 Michael 的搜索结果。
那么,我应该怎么做呢?我已经搜索 Google 好几天了,但我还没有找到 return 包含多个出版物和多个作者的部分视图的解决方案。有人有解决方案吗?
您需要切换 p.Authors.ToList().Contains(auth[0])
以便它使用 auth
返回的所有值
像这样的东西应该可以工作:
return PartialView("_PublicationList", await db.Publications
.Where(p => p.Authors.Any(a => auth.Contains(a)).ToListAsync());
英文:"List of publications where the list of that publication's authors has a match in the searchAuthor list"
我有一个包含学术出版物的数据库,这些出版物都有多个作者。我有一个页面显示这些出版物的分页部分视图,具有多个过滤选项,旨在同时使用多个过滤器。
我已经能够很好地实现所有其他过滤选项,但给我带来麻烦的是作者过滤器,用户可以在其中输入作者姓名,它会 return 该作者的任何出版物。
这是一个代码优先的数据库,发布模型包含:
public virtual ICollection<Author> Authors { get; set; }
同样,在 Author 模型中:
public virtual ICollection<Publication> Publications { get; set; }
现在,我有控制器 return 像这样的局部视图:
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" 是视图文本框中的值(为简单起见,我省略了其他过滤器)。
如您所见,这只会搜索匹配的第一作者。如果有人输入 "Michael",并且有多个 Michael 贡献,它只会显示第一个 Michael 的搜索结果。
那么,我应该怎么做呢?我已经搜索 Google 好几天了,但我还没有找到 return 包含多个出版物和多个作者的部分视图的解决方案。有人有解决方案吗?
您需要切换 p.Authors.ToList().Contains(auth[0])
以便它使用 auth
像这样的东西应该可以工作:
return PartialView("_PublicationList", await db.Publications
.Where(p => p.Authors.Any(a => auth.Contains(a)).ToListAsync());
英文:"List of publications where the list of that publication's authors has a match in the searchAuthor list"