Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在联接表,未设置获取对象引用_C#_Mysql_Asp.net_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

C# 正在联接表,未设置获取对象引用

C# 正在联接表,未设置获取对象引用,c#,mysql,asp.net,asp.net-mvc,asp.net-mvc-5,C#,Mysql,Asp.net,Asp.net Mvc,Asp.net Mvc 5,我正在将一个现有的程序转换为MVC5,我需要从一个数据库连接多个表。我做了一个虚拟项目来进行实验,这样我就不会对任何东西造成不可修复的损坏,而且我已经成功地将数据库中的所有表都拉出来并显示出来了。然而,当我尝试加入它们时,我得到“对象引用未设置为对象的实例” 注意:产品和任务是数据库中现有的模型和表。它已经部署好了,我们不能改变它们 相关控制器代码: public ActionResult Index() { _db.Configuration.ProxyCreation

我正在将一个现有的程序转换为MVC5,我需要从一个数据库连接多个表。我做了一个虚拟项目来进行实验,这样我就不会对任何东西造成不可修复的损坏,而且我已经成功地将数据库中的所有表都拉出来并显示出来了。然而,当我尝试加入它们时,我得到“对象引用未设置为对象的实例”

注意:产品和任务是数据库中现有的模型和表。它已经部署好了,我们不能改变它们

相关控制器代码:

public ActionResult Index()
    {
        _db.Configuration.ProxyCreationEnabled = false;
        var JoinTest = (
            from a in _db.Task.AsEnumerable()
            join b in _db.Product on a.ProductId equals b.ProductId
            select new
            {
                TaskId = a.TaskId,
                TaskDesc = a.TaskDescription,
                ProdDesc = b.ProductDescription
            });
        ViewData["CompositeData"] = JoinTest;
        ViewData["ProductData"] = _db.Product.ToList();
    }
查看代码:

@foreach (var item in ViewData["CompositeData"] as List<TomFoolery.Models.ViewModel>)
    {
    //Printing relevant items from DB
    }
那么,我哪里出错了?

ViewData[“CompositeData”]as List
将返回null,因为您设置为
ViewData[“CompositeData”]
的项是匿名类型的列表

您应该创建一个视图模型并使用它

 public class MyViewModel
 {
     public int TaskId  {set;get;}
     public string TaskDesc {set;get;}
     public string ProductDesc {set;get;}
 }
在投影部分使用它

ViewData["CompositeData"] = (
            from a in _db.Task.AsEnumerable()
            join b in _db.Product on a.ProductId equals b.ProductId
            select new MyViewModel
            {
                TaskId = a.TaskId,
                TaskDesc = a.TaskDescription,
                ProdDesc = b.ProductDescription
            }).ToList();
在视图中,需要强制转换到此视图模型集合

@foreach (var item in ViewData["CompositeData"] as List<TomFoolery.Models.MyViewModel>)
{
   <p>@item.TaskId</p>
}
在您的视图中,它是我们新的视图模型的强类型

@model MyPageViewModel
@foreach(var item in Model.Tasks)
{
  <p>@item.TaskId</p
  <p>@item.TaskDesc</p>
  <p>@item.ProdDesc</p>
}
@model MyPageViewModel
@foreach(Model.Tasks中的var项)
{
@item.TaskId
ViewData[“CompositeData”]as List
将返回null,因为设置为
ViewData[“CompositeData”]
的项是匿名类型的列表

您应该创建一个视图模型并使用它

 public class MyViewModel
 {
     public int TaskId  {set;get;}
     public string TaskDesc {set;get;}
     public string ProductDesc {set;get;}
 }
在投影部分使用它

ViewData["CompositeData"] = (
            from a in _db.Task.AsEnumerable()
            join b in _db.Product on a.ProductId equals b.ProductId
            select new MyViewModel
            {
                TaskId = a.TaskId,
                TaskDesc = a.TaskDescription,
                ProdDesc = b.ProductDescription
            }).ToList();
在视图中,需要强制转换到此视图模型集合

@foreach (var item in ViewData["CompositeData"] as List<TomFoolery.Models.MyViewModel>)
{
   <p>@item.TaskId</p>
}
在您的视图中,它是我们新的视图模型的强类型

@model MyPageViewModel
@foreach(var item in Model.Tasks)
{
  <p>@item.TaskId</p
  <p>@item.TaskDesc</p>
  <p>@item.ProdDesc</p>
}
@model MyPageViewModel
@foreach(Model.Tasks中的var项)
{
@item.TaskId
JoinTest
是一个
IEnumerable
,因此不能将其强制转换到
列表中

JoinTest
是一个
IEnumerable
,因此不能将其强制转换到
列表中


我必须编辑模型还是不编辑该函数?这取决于
ViewModel
的定义是否与匿名类型相同。如果是,它应该可以工作。否则,请按照Shyju的回答进行操作。注意。感谢您的帮助。我必须编辑模型还是不编辑该函数?这取决于的定义de>ViewModel
是否与匿名类型相同。如果是,它应该可以工作。否则,请按照Shyju的回答进行操作。注意。感谢您的帮助。将JoinTest变量(IQueryble)传递到视图不是也有问题吗。即使toList()在呈现视图时对该变量调用,_db可能已被释放,因为控制器已被释放。请注意,可能与此问题有关。需要一些生命周期深入验证。将JoinTest变量(IQueryble)传递到视图不是也有问题吗。即使toList()在呈现视图时对该变量调用,_db可能已被释放,因为控制器已被释放。请注意,可能与此问题有关。需要进行一些生命周期深入验证。
    var JoinTest = (
        from a in _db.Task.AsEnumerable()
        join b in _db.Product on a.ProductId equals b.ProductId
        select new TomFoolery.Models.ViewModel /* changed */
        {
            TaskId = a.TaskId,
            TaskDesc = a.TaskDescription,
            ProdDesc = b.ProductDescription
        });
    ViewData["CompositeData"] = JoinTest.ToList(); /*changed */