【问题标题】:How to display two tables separately in a single view with a join query in one table?如何在一个表中使用连接查询在一个视图中分别显示两个表?
【发布时间】:2019-04-20 05:28:47
【问题描述】:

我正在使用 C# 和实体框架在 ASP.NET MVC 中创建仪表板。

我有两张桌子

  1. Tbl_Channel (Id, Channel_Name)
  2. Tbl_News(Id、Channel_Id、News_Title、News_Description)

当我尝试这个查询时:

 public ActionResult Dashboard()
    {
       ShowData model = new ShowData();
       var rs1 = (from c in db.Tbl_Channel select c).ToList();

       var rs2 = (from c in db.Tbl_News
                  join d in db.Tbl_Channel on c.Channel_Id equals d.Id
                  select new
                         {
                              c.Id,
                              c.News_Title,
                              c.News_Description,
                              d.Channel_Name
                         })
                 .OrderByDescending(x => x.Id)
                 .ToList();

       model.tbl_ChannelData = rs1;
       model.tbl_NewsData = rs2;

       return View(model);
}

我在 model.tbl_NewsData = rs2 行中收到以下错误:

模型类:

public class ShowData
{
    public List<Tbl_Channel> tbl_ChannelData { get; set; }
    public List<Tbl_News> tbl_NewsData { get; set; }
}

错误:

无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List”

我想显示的输出是这样的:

(Id, Channel_Name, News_Title, News_Description)

【问题讨论】:

  • 你能给我们更多的背景信息吗?此语句是否在具有返回值的方法中?如果你真的只有一个var query 变量,那么这个错误不应该发生
  • @marc_s 我更新了问题。请检查它
  • 在模型类中我创建了该表的列表,在控制器类中我试图在模型中绑定查询,这意味着通道名称进入查询但模型类在 tbl_news 中找不到该属性。 .所以我只想知道实现我想要的结果的实际代码是什么。谢谢。

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


【解决方案1】:

问题的根本原因是:您在模型类中定义了如下属性:

public class ShowData
{
    public List<Tbl_Channel> tbl_ChannelData { get; set; }
    public List<Tbl_News> tbl_NewsData { get; set; }
}

然而,您的查询选择了匿名类型:

  select new
         {
             c.Id,
             c.News_Title,
             c.News_Description,
             d.Channel_Name
         }

这会导致错误。您需要做的是实例化模型类上定义的类型的对象,例如

  select new Tbl_News
         {
             c.Id,
             c.News_Title,
             c.News_Description,
             d.Channel_Name
         }

或者如果这个匿名类型不匹配任何现有类型,你需要定义一个合适的类型

public class ChannelAndNews
{
     public int ChannelId { get; set; }
     public string NewsTitle { get; set; }
     public string NewsDescription { get; set; }
     public string ChannelName { get; set; }
}

并创建该类型的实例,然后您可以将其分配给模型类属性:

select new ChannelAndNews
         {
             ChannelId = c.Id,
             NewsTitle = c.News_Title,
             NewsDescription = c.News_Description,
             ChannelName = d.Channel_Name
         }

【讨论】:

  • @marc_c 好的,我现在试过了,我应该在出现错误的行中写什么:即。模型。??? = rs2;
  • 你需要在你的模型类中有一个属性public List&lt;ChannelAndNews&gt; channelAndNews,然后才能使用model.channelAndNews = rs2;
  • 非常感谢。它有效.. 我被困在那里 3 天.. 非常感谢。
【解决方案2】:

将查询更改为这个可能有效:

  var query = (from c in db.tblnews 
                 join d in db.tblchannel on c.Channel_Id equals d.Id 
                 Select new Data()
                        {
                            Id = c.Id,
                            News_Title= c.News_Title,
                            News_Description= c.News_Description,
                            Channel_Name= d.Channel_Name
                         })
                .OrderByDescending(x => x.Id)
                .ToList();


return View(query)

创建这个类:

public class Data
{
        public int Id{ get; set; }
        public string News_Title{ get; set; }
        public string News_Description{ get; set; }
        public string Channel_Name{ get; set; }
}

【讨论】:

  • 这一行 model.tbl_NewsData 有问题,因为您想将匿名类型添加到 model.tbl_NewsData,您应该使用该属性(Id、Channel_Name、News_Title、News_Description)创建一个类并将您的选择转换为.
  • 我已经尝试过这样但我没有找到返回查询的方法。如果您为控制器编写代码,这对我将非常有帮助。谢谢
  • @inżynier umair 首先告诉我用这种方式解决了你的错误?
  • @hassen.ef 不,先生,在创建模型类或我试图获得结果后遇到同样的错误。 :(
  • @inżynier umair 编辑您的问题并将您的两个模型都放在这里
【解决方案3】:

您的预期结果:[只是假设] []1 所需的课程:[在您的情况下]

public class Tbl_Channel
{
    public int Id { get; set; }
    public string Channel_Name { get; set; }
}

public class Tbl_News
{
    public int Id { get; set; }
    public int Channel_Id { get; set; }
    public string News_Title { get; set; }
    public string News_Description { get; set; }
}

public class ChannelsAndNews
{
    public int ChannelId { get; set; }
    public string Channel_Name { get; set; }
    public string News_Title { get; set; }
    public string News_Description { get; set; }
}

public class ShowData
{
    public List<Tbl_Channel> Channels { get; set; }
    public List<Tbl_News> News { get; set; }
    public List<ChannelsAndNews> ChannelsAndNews { get; set; }
}

控制器方法:[更改]

public ActionResult ShowData()
    {            
        // GetChannels() & GetNews()  -- Seeded Locally in your case from DB.
        var showDataModel = new ShowData();
        showDataModel.Channels = (from channel in GetChannels() select channel).ToList();
        showDataModel.News = (from news in GetNews() select news).ToList();
        showDataModel.ChannelsAndNews = (from channel in GetChannels()
                                         join news in GetNews() on channel.Id equals news.Channel_Id
                                         select new ChannelsAndNews
                                         {
                                             ChannelId = channel.Id,
                                             Channel_Name = channel.Channel_Name,
                                             News_Title = news.News_Title,
                                             News_Description = news.News_Description
                                         })
                                         .OrderByDescending(channelnews => channelnews.ChannelId)
                                         .ToList();
        return View(showDataModel);
    }

这似乎工作正常。

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多