我正在制作电影数据库webapp,但我不知道如何使用多对多进行搜索,如果我想要按类型搜索电影,我该怎么做?我怎样才能使实体框架能够搜索动态数量的类型,就像我可以搜索1,2或更多类型一样。喜欢过滤。
这是我到目前为止所得到的
g.GenreID = 2
g => g.GenreID == 2 && g.GenreID == 3
目前是硬编码的,但是如何让它接受GenreID进行搜索?我尝试Movie
---------------------------
MovieID MovieTitle
1 The GodFather
2 Analyze This
3 The GodFather Part II
Genre
---------------------------
GenreID GenreName
1 Comedy
2 Crime
3 Drama
MovieGenre
---------------------------
MovieID GenreID
1 2 // The GodFather -- Crime, Drama
1 3 //
2 1 // Analyze This -- Comedy, Crime
2 2 //
3 2 // The GodFather Part 2 -- Crime, Drama
3 3 //
Result
---------------------------
Search: Drama
Result: The GodFather, The GodFather Part II
Search: Comedy
Result: Analyze This
Search: Crime
Result: The GodFather, Analyze This, The GodFather Part II
Search: Crime, Drama
Result: Result: The GodFather, The GodFather Part II
Search: Crime, Drama, Comedy
Result: none
,但它不会返回任何电影。当这两个条件都成立时,如何让它返回电影呢?
这是我的表,底部是我想要完成的。
Movie.cs
public class Movie
{
public int MovieID { get; set; }
public string MovieTitle { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
}
Genre.cs
public class Genre
{
public int GenreID { get; set; }
public string GenreName { get; set; }
public virtual ICollection<Movie> Movies { get; set; }
}
AppDbContext.cs
public class AppDbContext : DbContext
{
public AppDbContext() : base("MovieConnection")
{
}
public DbSet<Movie> Movies { get; set; }
public DbSet<Genre> Genres { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
这是我的模型和背景
do {
if let responseObject = try NSJSONSerialization.JSONObjectWithData(response, options: []) as? [String:AnyObject],
arrayStatuses = responseObject["statuses"] as? [[String:AnyObject]] {
let arrTweets:NSMutableArray = NSMutableArray()
for status in arrayStatuses {
let text = status["text"]!
print(status["text"]!)
}
}
}
答案 0 :(得分:1)
您可以使用&#39; OR&#39;这样的条件g => g.GenreID == 2 || g.GenreID == 3
使用&#39; AND&#39; g => g.GenreID == 2 && g.GenreID == 3
中的条件意味着它将返回同时具有genreid 2和3的记录。单个记录不能具有多个genreid。
如果您需要退回同时具有同义词类型的电影, 你需要像这样的基本查询
select MovieID
from MovieGenre
where GenreID in(244,246)
group
by MovieID
having count(*) = 2 ;
&#39; 2&#39;是类型id传递的数量。将其改为相应的Linq
Linq可能是这样的。这个linq未经测试,可能包含错误
var query = from movie in db.Movies
where movie.Genres.Any(g => g.GenreID == 2|| g.GenreID == 3)
group movie by movie.MovieID into m
where m.Count() == 2
select movie.MovieID
答案 1 :(得分:0)
您正在使用查询语法混合方法。 也许这有效
var Movies = db.Movies.Where(m => m.Genres.Any(g => g.GenreID == 2).FirstOrDefault()).ToList();
答案 2 :(得分:0)
因此,如果选择2和3,它将返回流派2或3的电影。
public ActionResult Search(IEnumerable<int> selectedGenreIds)
{
var moviesInSelectedGenres = db.Genres.Where(x => selectedGenreIds.Any(z => z == x.GenreId)).Select(x => x.Movies);
}
答案 3 :(得分:0)
试试这个:
var genreIds = new List<int> { 2, 3 };
using (var db = new YourContext())
{
var movies = db.Movies;
foreach (var genreId in genreIds)
{
movies = movies.Where(m => m.Genres.Any(g => g.GenreID == genreId));
}
var queryResults = movies.ToList();
}