【问题标题】:Method To Return a List of Recommendations to the User将推荐列表返回给用户的方法
【发布时间】:2023-03-21 11:52:01
【问题描述】:

我已经创建了数据库和表以及每个表的模型类,它们具有与列名相同的属性。 我如何在控制器类 [Asp.Net MVC] 中创建一个方法来向用户返回音乐推荐列表,即用户朋友库中的音乐。 每个用户在他们的库中都有一个音乐曲目列表,每个用户都有一个朋友(用户)列表。推荐是所有音乐曲目,这些曲目归用户的直接朋友所有,但不归用户所有。 类似地使用 MusicInfoDBContext 类和Dbsets: public DbSet<Users> Users{ get; set; } 以下是方法的签名:

List<Music> getMusicRecommendations(User user);

DBScript 如下:

CREATE DATABASE OnlineMusicStore
    CREATE TABLE Users(
    ID int primary key identity(1,1),
    Username nvarchar(255)
    )

    CREATE TABLE Music
    (
    ID int primary key identity(1,1),
    MusicName nvarchar(255),
    )

    CREATE TABLE Users_Music
    (
    UserId int foreign key references Users(ID),
    MusicId int foreign key references Music(ID)
    )

    CREATE TABLE Users_Friends
    (
    UserId int foreign key references Users(ID),
    FriendId int foreign key references Users(ID)
    )
 public class Users
    {
        public int ID { get; set; }
        public string UserName { get; set; }
    }
  public class Music
    {
        public int ID { get; set; }
        public string MusicName { get; set; }
    }
 public class Users_Music
    {
        public int UserId { get; set; }
        public int MusicId { get; set; }
    }
  public class Users_Friends
    {
        public int UserId { get; set; }
        public int FriendId { get; set; }
    }

任何人都可以详细说明解决方案,因为我可以更好地理解它。 我的一位朋友建议使用:

recommendations = AllFriendsMusicList.Except(user.MusicList)

【问题讨论】:

    标签: sql asp.net asp.net-mvc sql-server-2008 asp.net-mvc-3


    【解决方案1】:

    将其分解为每个组件

    您可以获取用户直接朋友的 ID

    IEnumerable<int> friendIDs = db.Users_Friends
        .Where(u => u.UserId == user.ID)
        .Select(u => u.FriendId);
    

    然后你就可以得到所有朋友音乐的ID

    IEnumerable<int> musicIDs = db.Users_Music
        .Where(m => friendIDs.Contains(m.UserId))
        .Select(m => m.MusicId);
    

    最后得到所有的音乐对象

    IEnumerable<Music> model = db.Music
        .Where(m => musicIDs.Contains(m.ID));
    

    或者如果您需要List&lt;Music&gt;,则在上面添加ToList()

    所以你的方法变成了

    public List<Music> getMusicRecommendations(User user)
    {
        IEnumerable<int> friendIDs = db.Users_Friends.Where(u => u.UserId == user.ID).Select(u => u.FriendId);
        IEnumerable<int> musicIDs = db.Users_Music.Where(m => friendIDs.Contains(m.UserId)).Select(m => m.MusicId);
        return db.Music.Where(m => musicIDs.Contains(m.ID)).ToList();
    }
    

    【讨论】:

    • 我的数据库设计没问题,我可以用一个方法实现上面的代码吗?
    • 我对您的应用了解不多,无法评论该设计是否最适合您。而且由于您的类不包括导航属性(public virtual User ... 等),我怀疑您可以在单个语句中执行此操作(这是我假设您的意思,因为所有这些都在 getMusicRecommendations(User user){ ... return model;} 中,这是一个单一的方法)但我会考虑的)。
    • 我认为没有比我建议的更好的方法了。我已经更新了答案以显示完整的方法。
    • 我能把上面所有的代码都包含在 Some controller 的 index 方法中吗?
    • 你可以,但为什么呢?理想情况下,它应该是一个方法(最好在服务中),以便您可以在任何地方调用它。更好的是,该服务应该被注入到控制器中。
    【解决方案2】:

    伪代码:

    user.friends.selectall(friend->friend.musics).distinct()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多