2010-09-23 180 views
1

我最近开始使用LINQ to SQL,我有一个小复杂的查询,我需要帮助。 我有一个表在我的数据库称为MovieComment,有以下栏目:LINQ to SQL Group by C#问题

  • CommentID
  • 用户名
  • MovieID
  • 评论
  • 时间戳

那么,是什么我想要做的是将MovieID上的评论分组并将其保存到名为Movie的对象中,其中MovieID被保存在MovieID中后,并且Linq对象保存在Movie对象内的ObservableCollection中。

public class Movie 
{ 
    #region Member Variables 

    public int MovieID { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 
    public Uri Poster { get; set; } 
    public double Rating { get; set; } 
    public DateTime Timestamp { get; set; } 

    public ObservableCollection<MovieComment> Comments { get; set; } // Linq object: MovieComment 

    #endregion // Member Variables 
} 

我已经想出以下LINQ查询在那里我得到MovieID,但我真的不知道我应该怎么着手得到所有其他数据的保持

public ObservableCollection<Movie> LoadMovieID(int _userID, int _limit) 
{ 
    ObservableCollection<Movie> movies = new ObservableCollection<Movie>(); 

    var query = (from mc in db.MovieComment 
      where mc.UserID == _userID 
      orderby mc.Timestamp descending 
      group mc by mc.MovieID into movie 
      select new 
      { 
       MovieID = movie.Key, 
      }).Take(_limit); 

    foreach (var row in query) 
    { 
     Movie movie = new Movie(); 
     movie.MovieID = row.MovieID; 

     // I want to get the following: 
     // movie.MovieComment = MovieComment-objects with the MovieID == row.MovieID 

     movies.Add(movie); 
    } 

    return movies; 
} 

这是甚至可能在一个单一的查询?感谢所有帮助我能

回答

5

好了,你可以试试这个:

var query = (from mc in db.MovieComment 
     where mc.UserID == _userID 
     orderby mc.Timestamp descending 
     group mc by mc.MovieID).Take(_limit); 

这会给你一个IGrouping<MovieComment, string>(或任何你的类型),它应该让你在没有任何所有评论加班。就LINQ本身而言,这当然是可以的,但是在LINQ to SQL中它是否会做到你想要的,我不确定。

+0

+1 - 但我也建议你学会使用Lambda表达式而不是查询语法,因为你会发现使用更复杂的查询要容易得多。 FYI相当于上面的lambda:var query = db.MovieComment.Where(mc => mc.UserID == _userID).OrderByDescending(mc => mc.Timestamp).GroupBy(mc => mc.MovieID).Take (_limit) – Dan 2010-09-23 20:10:41

+1

@Dan:相反,我发现查询表达式对于复杂查询很容易,而lambda表达式对于* simple *查询更好。我同意OP应该学习lambda语法,但*以及*查询表达式,而不是“而不是”。 – 2010-09-23 20:16:54

+0

我完全同意学习两者很重要。我发现Lambda和Query语法之间的区别非常个人化。我倾向于在多行中布局我的lambda表达式,这对我来说很合适。 – Dan 2010-09-23 20:27:12