0

我有两张表,分别用于用户和歌曲。我需要在 UserID 列上加入它们并将列表返回到视图。我尝试编写匿名类型,但出现以下错误:

“LINQ to Entities 中仅支持无参数构造函数和初始化程序。”

如何加入并返回列表?

 public class User
    {
        [Key]
        public virtual Guid UserId { get; set; }

        [Required]
        public virtual String Username { get; set; }

        [Required]
        public virtual String Email { get; set; }

        [Required, DataType(DataType.Password)]
        public virtual String Password { get; set; }

}





 public class Song
    {
        public int SongId { get; set; }

        public virtual Guid UserId { get; set; }

        public string SongTitle { get; set; }

    }

我尝试在这里实现这样的方法:

我的 linq 查询的返回类型是什么?

我最终得到的查询是:

var query = from u in db.Users
                        join s in db.Songs
                        on u.UserId equals s.UserId
                        select new HomeSongList(s.SongId, s.UserId, u.Username);


            return View(query.ToList());
4

2 回答 2

2

那么错误信息很清楚,不是吗?

您尝试在 linq2entity 查询中创建一个新的 HomeSongList(这将在 sql 中翻译:不可能)

通过“用户属性”更正,您应该

var query = db.Songs.Select(s => new{
                       songId = s.SongId, 
                       userId = s.User.UserId, 
                       userName = s.User.Username})
                     .ToList()
                     .Select(x => new HomeSongList(x.songId, x.userId, x.userName);

或使用您的实际代码

var query = (from u in db.Users
                        join s in db.Songs
                        on u.UserId equals s.UserId
                        select new {
                          songId = s.SongId, 
                          userId = s.UserId, 
                          userName = u.Username
                         })//new anonymous object is possible in linq2entities
                        .ToList()
                        .Select(x => new HomeSongList(x.songId, x.userId, x.userName);
于 2012-05-10T22:27:26.577 回答
2

您不能使用参数化构造函数,但可以使用初始化程序,如果您将选择更改为以下内容,它应该可以工作。

select new HomeSongList{SongId=s.SongId, UserId=s.UserId, Username=u.Username};

请注意,这将需要HomeSongList具有无参数构造函数和可写属性。

于 2012-05-10T23:16:15.837 回答