【问题标题】:LINQ to SQL Group by C# problemLINQ to SQL Group by C# 问题
【发布时间】:2010-09-23 14:13:10
【问题描述】:

我最近开始使用 LINQ to SQL,我有一个小复杂查询需要帮助。 我的数据库中有一个名为 MovieComment 的表,其中包含以下列:

  • 评论ID
  • 用户 ID
  • 电影 ID
  • 评论
  • 时间戳

所以,我想做的是将 MovieID 上的 cmets 分组并将它们保存到我的名为 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;
}

这甚至可以在单个查询中实现吗?感谢我能得到的所有帮助

【问题讨论】:

    标签: c# linq-to-sql group-by


    【解决方案1】:

    嗯,你可以试试这个:

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

    这会给你一个IGrouping&lt;MovieComment, string&gt;(或任何你的类型),它应该让你在没有任何额外工作的情况下获得所有的 cmets。就 LINQ 本身而言当然没问题,但我不确定它是否会在 LINQ to SQL 中执行您想要的操作。

    【讨论】:

    • +1 - 但我还建议您学习使用 Lambda 表达式而不是查询语法,因为您会发现使用它来处理更复杂的查询要容易得多。仅供参考,上面的 lambda 等效项是: var query = db.MovieComment.Where(mc => mc.UserID == _userID).OrderByDescending(mc => mc.Timestamp).GroupBy(mc => mc.MovieID).Take (_limit)
    • @Dan:相反,我发现查询表达式对于复杂查询很容易,而 lambda 表达式更适合简单查询。我同意 OP 应该学习 lambda 语法,但 以及 查询表达式,而不是“而不是”。
    • 我完全同意学习两者都很重要。我发现 Lambda 和 Query 语法之间的区别在很大程度上是个人喜好。我倾向于跨多行布局我的 lambda 表达式,我觉得这对我很有效。
    猜你喜欢
    • 2010-12-31
    • 2010-11-15
    • 1970-01-01
    • 2016-05-26
    • 2011-04-18
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多