实体框架多对多搜索

时间:2016-08-02 10:23:13

标签: asp.net-mvc entity-framework

我正在制作电影数据库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"]!)
               }
       }
}

4 个答案:

答案 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();
}