【问题标题】:Mapping to model映射到模型
【发布时间】:2019-03-09 12:13:59
【问题描述】:

如何使用实体的代码优先方法将连接表数据映射到模型?我想在获取聊天消息时获取属于聊天消息的用户信息。我收到了错误

无法将 linq.iqueryable 输入到 collections.generic.list

但我无法 ToList() 我的 iqueryable。

   List<Models.ChatMessageModel> list = from dbModel in db.ChatMessages
                                              join a in db.Users on dbModel.UserId equals a.UserId
                                              select new Models.ChatMessageModel
                                              {
                                                  User = new Models.UserModel
                                                  {
                                                      UserId = dbModel.UserId,
                                                      UserName = a.UserName
                                                  },
                                                  UserId = a.UserId,
                                                  DateSent = dbModel.DateSent,
                                                  ChatMessage = dbModel.ChatMessage,
                                                  ChatMessageId = dbModel.ChatMessageId
                                              };

聊天消息模型

 public class ChatMessageModel
    {
        [Key]
        public Guid ChatMessageId { get; set; }

        public virtual Guid UserId { get; set; }

        [ForeignKey("UserId")]
        public virtual UserModel User { get; set; }
        public string ChatMessage { get; set; }

        public DateTime DateSent { get; set; }
    }

【问题讨论】:

  • 您能提供更多信息吗?您的 DbContext 看起来如何?您想更准确地实现什么目标?
  • @Donio Teixeira,您当前的代码有什么问题?
  • 我用聊天消息模型更新了帖子。当我获取所有聊天消息时,我想获取属于聊天消息的用户信息,但我不太确定如何首先使用代码。
  • @TanvirArjel 我收到错误“无法将 linq.iqueryable 输入到 collections.generic.list 但我无法 ToList() 我的 iqueryable。
  • Convert IQueryable<> type object to List<T> type? 的可能重复项。只要搜索它之前已经回答过。

标签: c# asp.net-mvc ef-code-first-mapping


【解决方案1】:

只需使用 ToList 方法转换为 List

List<Models.ChatMessageModel> list = (from dbModel in db.ChatMessages
        join a in db.Users on dbModel.UserId equals a.UserId
        select new Models.ChatMessageModel
        {
           User = new Models.UserModel
           {
               UserId = dbModel.UserId,
               UserName = a.UserName
           },
           UserId = a.UserId,
           DateSent = dbModel.DateSent,
           ChatMessage = dbModel.ChatMessage,
           ChatMessageId = dbModel.ChatMessageId
        }).ToList();

【讨论】:

  • 是的,already answered here
  • 是的,你应该这样做。
  • 当我看到您的评论时,我意识到为什么我的 ToList() 不起作用,我没有将 iqueryable 括在括号中,所以我无法 .ToList() 它。我对此很陌生,但我觉得很愚蠢。谢谢和抱歉。
【解决方案2】:

如果您尝试从聊天消息中获取用户信息,您可以尝试:

db.ChatMessages.Include(chatMessage => chatMessage.User).ToList();

以上返回所有聊天消息使用的所有用户。

这里的技巧是使用延迟加载的 EF。由于您在 ChatMessages 上的外键指向用户,因此 EF 足够聪明,可以将其返回到您的虚拟用户字段中。

只要你的上下文(在你的情况下,变量db)没有被释放,延迟加载就会加载你的用户,但是如果你想立即加载它,你可以使用Include(chatMessage =&gt; chatMessage.User)方法来代替。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多