.net - 如何使用 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]'.
我做了什么;
- 我还指定了列名,例如
选择新的 { t.Assistance, s.StatusId }).ToList();
- 而且我使用“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; }
解决方案
您的模型是 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()
推荐阅读
- classcastexception - java.lang.ClassCastException:[Ljava.lang.Object;不能转换为 java.util.List
- java - 打印 javax.servlet.http.Cookie 的所有字段的任何实用程序
- c# - 我正在开始一个新的 .Net Core 项目,但我不知道应该如何为 nuget 包实现可为空的引用类型
- javascript - 将 styled-jsx 与 postcss 一起使用,样式不会重新加载/重建
- php - 从 URL 获取日期/时间格式
- algorithm - PySpark 将算法转换为 UDF 并将其应用于 DataFrame
- git - 从 Git 存储库中删除 .pack 文件的缺点是什么?
- android - Android - 在长 for 循环中计算时协程比 RX Completable 慢
- flutter - Draggable 和 DragTarget,如何在 DragTarget 中接受 Draggable 后构建小部件?
- java - swagger 2 spring boot - 有 2 个同名的 API,但只显示其中一个