如何传递列表SQL连接以在C#中查看?

问题描述

在我的控制器中,我返回一个列表,该列表是联接2个表的结果。现在,我想将此列表传递给我的视图,但不能执行此操作。发生此类错误

System.Collections.Generic.List1 [ f__AnonymousType2 [System.String,System.String,System.String,...等等,等等],此词典需要类型为 System的元素。 Collections.Generic.IEnumerable [XYZ.Models.MyModelTable]。

        public ActionResult someAction()
        {
            BASEdb db = new BASEdb();

            var model = db.MyModelTable
                            .Join(db.Customers,z => z.FOPKTO_,k => k.ID,(z,k) => new { FOPKTO = z,Customers = k })
                            .Where(w => w.FOPKTO.Date == null)
                            .Select(s => new
                                     {
                                      s.Customers.Name,s.MyModelTable.FOPKTO,s.MyModelTable.FOPBDA,s.MyModelTable.FOPGSS,})
                             .ToList();

            return View(model);
        }

和我的观点:

@model IEnumerable<XYZ.Models.MyModelTable>


    @{
        ViewBag.Title = "Invoices";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }

    <h2>Invoices</h2>


    <table class="table">
        <tr>
            <th>
                @Html.displayNameFor(model => model.FOPBDA)
            </th>
            <th>
                @Html.displayNameFor(model => model.FOPLBN)

.... etc. (there's foraeach instruction below as well)

如何将从2个表返回数据的列表传递给View?我的视图现在采用一个表的类型(MyModelTable)? 我认为应该是更通用的类型,但不知道如何解决

解决方法

您应该为视图创建一个ViewModel。这将是您的视图专用的数据结构,也可以是其他两个模型的组合。

网络上的大量信息,这是StackOverflow的示例:

What is ViewModel in MVC?

您这样做的方式不是创建IEnumerable<XYZ.Models.MyModelTable>(视图中期望的类型),而是创建匿名类型列表。

我们称之为MyViewModel。您可以这样声明:

public class MyViewModel(){
    public string Name {get;set;}
    public int FOPKTO {get;set;}
    public int FOPBDA {get;set;}
    public int FOPGSS {get;set;}
}

然后在您的控制器中,将其构建为:

        var model = db.MyModelTable
                        .Join(db.Customers,z => z.FOPKTO_,k => k.ID,(z,k) => new { FOPKTO = z,Customers = k })
                        .Where(w => w.FOPKTO.Date == null)
                        .Select(s => new MyViewModel
                                 {
                                  Name = s.Name,FOPKTO = s.FOPKTO,FOPBDA = s.FOPBDA,FOPGSS = s.FOPGSS
                                  })
                         .ToList();

        return View(model);

然后更新视图以使用此视图模型代替以前的模型。

,

这是一个猜测,因为您没有显示MyModelTable类,但是您可能需要执行以下操作:

var models = db.MyModelTable
                .Join(db.Customers,Customers = k })
                .Where(w => w.FOPKTO.Date == null)
                .Select(s => new MyModelTable
                        {
                          Name = s.Customers.Name,FOPKTO = s.MyModelTable.FOPKTO,FOPBDA = s.MyModelTable.FOPBDA,FOPGSS = s.MyModelTable.FOPGSS,})
                 .ToList();
,

创建类似于MyViewModel的ViewModel类型。

public class MyViewModel(){
    public string Name { get; set; }
    public int FOPKTO { get; set; }
    public int FOPBDA { get; set; }
    public int FOPGSS { get; set; }
}

并选择要列出的内容。

BASEdb db = new BASEdb();

            var model = db.MyModelTable
                            .Join(db.Customers,Customers = k })
                            .Where(w => w.FOPKTO.Date == null)
                            .Select(s => new MyViewModel
                                     {
                                      Name = s.Customers.Name,FOPGSS = s.MyModelTable.FOPGSS
                                      })
                             .ToList();

            return View(model);

并将您的Views模型类型更改为MyViewModel

@model IEnumerable<MyViewModel>


   ... etc
,

简而言之,创建一个模型类。在该模型中定义属性。在您的控制器操作中填充该模型类的实例,然后返回到您的视图...简单。

请不要忘记将其作为答案:)谢谢