首页 > 解决方案 > 如何使用 linq 获取连接查询的视图

问题描述

首先,我对 .Net MVC 很陌生,如果有任何误解,我深表歉意。

自 2 天以来我一直在搜索这个问题,但不幸的是,我找不到答案。

我正在尝试在 linq 上进行连接查询,并希望通过列表查看。

先感谢您,

我的控制器;

                var QueryTransferList = (from t in db.Transfers
                                    .OrderBy(item => item.Date)
                                    .ThenBy(item => item.TransferTime)
                                    .ThenBy(item => item.GuestName)
                                    join s in db.StatusDurums
                                    on t.Status equals s.StatusName
                                    where
                                        t.Date >= todaysDate &&
                                        t.Date <= todaysDate
                                    select new { t, s }).ToList();
            return View(QueryTransferList);

我的观点;

@model IEnumerable<NuvoTTMS.Models.Transfer>
                    @foreach (var item in Model)
                {
                    <tr>
                        <td class="text-center">@Html.ActionLink(item.Id.ToString(), "Edit", new { id = item.Id })</td>
                        <td class="text-center">@Html.DisplayFor(modelItem => item.Date)</td>
                        <td>@Html.DisplayFor(modelItem => item.Reference)</td>
                        <td>@Html.DisplayFor(modelItem => item.GuestName)</td>
                        <td>@Html.DisplayFor(modelItem => item.From1)</td>
                        <td>@Html.DisplayFor(modelItem => item.To1)</td>
                        <td>@Html.DisplayFor(modelItem => item.Assistance)</td>
                        <td class="text-center">@Html.DisplayFor(modelItem => item.Pax)</td>
                        <td>@Html.DisplayFor(modelItem => item.FlightNumber)</td>
                        <td class="text-center">@Html.DisplayFor(modelItem => item.TransferTime)</td>
                        <td>@Html.DisplayFor(modelItem => item.TransferVehicle)</td>
                        <td>@Html.DisplayFor(modelItem => item.TransferSupplier)</td>
                        <td>@Html.DisplayFor(modelItem => item.DriverName)</td>
                    </tr>
                }

错误代码;

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[<>f__AnonymousType6`2[NuvoTTMS.Models.Transfer,NuvoTTMS.Models.StatusDurum]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[NuvoTTMS.Models.Transfer]'.

我做了什么;

  1. 我还指定了列名,例如

选择新的 { t.Assistance, s.StatusId }).ToList();

  1. 而且我使用“AsEnumerable()”而不是 .Tolist();

###更新###

我真的很感谢您的快速回复。我只是听从你的评论,它运作良好。

正如您可能看到的,我希望将所有列发送到下面的代码以供查看。我是否需要将所有列名一一写下,还是有其他方法可以做到这一点?

var QueryTransferList = (from t in db.Transfers
                                    .OrderBy(item => item.Date)
                                    .ThenBy(item => item.TransferTime)
                                    .ThenBy(item => item.GuestName)
                                     join s in db.StatusDurums
                                     on t.Status equals s.StatusName
                                     where
                                         t.Date >= todaysDate &&
                                         t.Date <= todaysDate
                                     select new NuvoTTMS.Models.TransferViewModel
                                     {
                                          Id = t.Id,
                                          Date = t.Date,
                                          Service = t.Service,
                                          Nationality = t.Nationality,
                                          Reference = t.Reference,
                                          GuestName = t.GuestName,
                                          From1 = t.From1,
                                          To1 = t.To1,
                                          Assistance = t.Assistance,
                                          Pax = t.Pax,
                                          FlightNumber = t.FlightNumber,
                                          TransferTime = t.TransferTime,
                                          TransferVehicle = t.TransferVehicle,
                                          TransferSupplier = t.TransferSupplier,
                                          Notes = t.Notes,
                                          InvoiceCode = t.InvoiceCode,
                                          InvoiceRate = t.InvoiceRate,
                                          Status = t.Status,
                                          DriverName = t.DriverName,
                                          StatusId = s.StatusId,
                                          StatusName = s.StatusName,
                                          StatusColor = s.StatusColor

                                     }).ToList();

还有我的最后一个问题,我将 Transfer 和 StatusDurum 模型组合到 TransferViewModel 如下。有什么方法可以将传输和状态模型实现到 TransferViewModel。

实际上,如果我在传输模型中进行任何更改,那么我需要在 tranferviewmodel 中进行,对吗?

public class TransferViewModel
{
    public int Id { get; set; }

    [Display(Name = "Date")]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime? Date { get; set; }


    [Display(Name = "Transfer Type")]
    public string Service { get; set; }

    [Display(Name = "National")]
    public string Nationality { get; set; }

    [Display(Name = "Gta Reference")]
    public string Reference { get; set; }

    [Display(Name = "Guest Name")]
    public string GuestName { get; set; }

    [Display(Name = "From")]
    public string From1 { get; set; }

    [Display(Name = "To")]
    public string To1 { get; set; }

    [Display(Name = "Ass.")]
    public string Assistance { get; set; }

    [Display(Name = "Pax")]
    public string Pax { get; set; }

    [Display(Name = "Flight No")]
    public string FlightNumber { get; set; }

    [Display(Name = "Time")]
    public string TransferTime { get; set; }

    [Display(Name = "Vehicle")]
    public string TransferVehicle { get; set; }

    [Display(Name = "Supplier")]
    public string TransferSupplier { get; set; }

    [Display(Name = "Transfer Notes")]
    public string Notes { get; set; }

    [Display(Name = "Invoice Rate")]
    public string InvoiceRate { get; set; }

    [Display(Name = "Invoice Code")]
    public string InvoiceCode { get; set; }

    [Display(Name = "Status")]
    public string Status { get; set; }

    [Display(Name = "Driver Name")]
    public string DriverName { get; set; }

    public int StatusId { get; set; }
    public string StatusName { get; set; }       
    public string StatusColor { get; set; }

标签: .netasp.net-mvcmodel-view-controller

解决方案


您的模型是 IEnumerable<NuvoTTMS.Models.Transfer>您在视图中指定的类型:

@model IEnumerable<NuvoTTMS.Models.Transfer>

所以你的视图应该被传递给那个类型的对象。现在你正在返回一个无法工作的匿名类型的集合。

您可以IEnumerable<NuvoTTMS.Models.Transfer>通过以下方式在 linq 查询中创建:

select new NuvoTTMS.Models.Transfer
{ 
  Assistance = t.Assistance,
  StatusId =  s.StatusId 
}).ToList()

由于您有来自多个模型的数据,因此如果出现这种情况,您将不得不创建一个具有视图所需属性的视图模型:

public class TransfersViewModel
{
   public int StatusId { get; set; }
   ............
   ............
}

然后在 View 中将您的模型设置为该类型:

@model IEnumerable<NuvoTTMS.Models.TransfersViewModel>

并填充它并将其返回到控制器操作中的 View :

select new NuvoTTMS.Models.TransfersViewModel
{ 
  Assistance = t.Assistance,
  StatusId =  s.StatusId 
}).ToList()

推荐阅读