【问题标题】:How to get specific columns from different tables ASP.NET Core and Entity Framework Core如何从不同的表 ASP.NET Core 和 Entity Framework Core 中获取特定的列
【发布时间】:2021-05-08 12:08:46
【问题描述】:

我想从两个不同的 ChatMessage 和 ChatGroup 表中获取一些特定的列。 这样返回数据后只包含messageId、Message、SenderUserId、CreatedDate、ChatGroupId。

查询返回 ApplicationUser 和 ChatGroup 数据的所有信息,包括电子邮件、散列密码、user1、user2、ChatMessages 以及更多我不想要的信息。所以我尝试在实现中添加Select

执行此操作会发生错误。

实施:

public  IEnumerable<ChatMessage> GetMessageInChat(ChatModel model)
{
    try
    {
        PutReadZero(model).Wait();
        return _context.ChatMessages.Where(userID => userID.ChatGroup.Id == model.GroupId)
            .OrderByDescending(m => m.CreatedDate)
            .AsEnumerable()
            .Reverse()
            .Select(p => new 
            {
                p.Id,
                p.Message,
                SenderUserId= p.SenderUser.Id,
                p.CreatedDate,
                ChatGroupId = p.ChatGroup.Id,
            })
            .ToList();
    }
    catch (Exception ex)
    {
        throw new NotImplementedException();
    }
}

ChatMessage.cs :

namespace ProjectName.Models
{
    public class ChatMessage
    {
        public int Id { get; set; }
        public string Message { get; set; }
        public string FileName { get; set; }
        public DateTime CreatedDate { get; set; }
        public ApplicationUser SenderUser { get; set; }
        public ChatGroup ChatGroup { get; set; }
    }
}

聊天组:

namespace ProjectName.Models
{
    public class ChatGroup
    {
        public int Id { get; set; }
        public virtual ApplicationUser User1 { get; set; }
        public virtual ApplicationUser User2 { get; set; }
        public int User1Unread { get; set; }
        public int User2Unread { get; set; }
        public DateTime CreatedDate { get; set; }
        public virtual IEnumerable<ChatMessage> ChatMessages { get; set; }
    }
}

ChatModel.cs :

namespace ProjectName
{
    public class ChatModel
    {
        public string SenderId { get; set; }
        public string ReceiverId { get; set; }
        public string Message { get; set; }
        public int GroupId { get; set; }
        public DateTime CreatedDate { get; set; }
        public IFormFile FileContent { get; set; }
    }
}

错误:

无法将类型'System.Collections.Generic.List>'隐式转换为'System.Collections.Generic.IEnumerable'。存在显式转换(您是否缺少演员表?)

【问题讨论】:

  • 删除AsEnumerable,并正确选择返回ChatMessage

标签: c# asp.net-mvc linq asp.net-core entity-framework-core


【解决方案1】:

如果您只想要表的数据而不需要任何连接,您可以使用 FromSqlRaw 并编写选择查询。

`var data = _context.ChatMessages.FromSqlRaw("SELECT * from ChatMessages Where ChatGroupId = model.GroupId").ToList();`

通过这种方式,您将获得所有需要的数据

【讨论】:

    【解决方案2】:

    拥有一个只包含您想要的属性的新模型。

    public class ChatMessageViewModel
    {
        public int Id { get; set; }
        public string Message { get; set; }
        public int SenderUserId { get; set; }
        public int ChatGroupId { get; set; }
        public DateTime CreatedDate { get; set; }
    }
    

    然后在linq中选择这个模型:

    .Select(p => new ChatMessageViewModel
    {
        Id = p.Id,
        Message = p.Message,
        SenderUserId= p.SenderUser.Id,
        CreatedDate  = p.CreatedDate,
        ChatGroupId = p.ChatGroup.Id,
    })
    

    然后将返回类型改为IEnumerable&lt;ChatMessageViewModel&gt;

    【讨论】:

      【解决方案3】:

      如果您需要来自GetMessageInChat 方法的强类型对象,那么您应该选择@mj1313 的答案。

      但如果您不需要类型化对象(例如,如果 GetMessageInChat 是某个控制器类中的操作方法),您可以简单地更改方法签名以返回 dynamic 类型 -

      public dynamic GetMessageInChat(ChatModel model)
      

      您可以将方法称为 -

      var myList = myObject.GetMessageInChat(chatModel);
      

      【讨论】:

        【解决方案4】:

        那是因为你指定你的方法应该返回一个 IEnumerable&lt;ChatMessage&gt; 但你的结果是返回一个匿名类型。 如果这是控制器中的操作方法,只需返回一个IActionResult,它允许在其响应中包含任何数据类型

        public IActionResult GetMessageInChat(ChatModel model)
        {
           ... 
            var result = _context.ChatMessages.Where(userID => userID.ChatGroup.Id == model.GroupId).OrderByDescending(m => m.CreatedDate).AsEnumerable().Reverse().Select(p => new { p.Id, p.Message, SenderUserId= p.SenderUser.Id, p.CreatedDate, ChatGroupId = p.ChatGroup.Id, }).ToList();
            return Ok(result);
        } 
        

        如果不是,请使用原始方法从查询中删除.Select(...)

        return _context.ChatMessages.Where(userID => userID.ChatGroup.Id == model.GroupId) .OrderByDescending(m => m.CreatedDate).Reverse().ToList();
        

        然后在调用GetMessageInChat()的操作方法中使用Select进行过滤。 action 方法应该返回一个IActionResult

        【讨论】:

        • 返回类型是IEnumerable&lt;ChatMessage&gt;,不是IEnumerable
        猜你喜欢
        • 2022-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-12
        • 1970-01-01
        • 2017-06-13
        • 2022-01-19
        相关资源
        最近更新 更多