更新:在评论中,很清楚我感到困惑的地方,因此尽管我无法将评论标记为答案,但此问题已解决。实际上,当我使用ViewModel时,一切工作正常,只是在视图中未正确使用它。谢谢你的帮助!
我正在MVC6中建立一个站点。我正在尝试创建一个linq语句以将预订表和场所表连接在一起,然后返回仍在进行的所有预订。我很高兴我的from和join语句以及过滤器都很好。
我有以下代码:
private readonly ApplicationDbContext ctx;
public ForthcomingBookingsViewComponent(ApplicationDbContext c)
{
ctx = c;
}
public IViewComponentResult Invoke(string filter)
{
DateTime todaysDate = new DateTime();
todaysDate = DateTime.Now;
var res = (from p in ctx.Booking
join i in ctx.Venue on p.VenueId equals i.VenueId
where p.DonorId.Equals(filter)
where p.BookingDate >= todaysDate
select ) //This is the line I'm struggling to work out
.toList();
return View(res);
}
麻烦来自试图将其列入我认为可以引用的列表中。我尝试了几种方法,首先,我尝试执行以下操作:
select new { p.BookingDate, i.VenueName }
但是问题在于我不确定如何将其称为模型。
然后,我以为可以使用ViewModel,因此可以先定义其中的内容:
select new FCBViewModel { BookingDate = p.BookingDate, VenueName = i.VenueName })
.ToList();
但是我又遇到了麻烦,因为这将它设置为单个对象而不是列表。正式化问题:
如何从两个联接的表中返回可以在视图中使用的对象列表?
谢谢!
最佳答案
您可以使用视图模型类在LINQ表达式中进行投影。
public IViewComponentResult Invoke(string filter)
{
DateTime todaysDate = new DateTime();
todaysDate = DateTime.Now;
var fcbVmList = (from p in ctx.Booking
join i in ctx.Venue on p.VenueId equals i.VenueId
where p.DonorId.Equals(filter)
where p.BookingDate >= todaysDate
select new FCBViewModel { BookingDate = p.BookingDate,
VenueName = i.VenueName })
.toList();
return View(fcbVmList);
}
在上面的代码中,变量
fcbVmList
将是FCBViewModel
的列表,您将其传递到视图组件的视图。现在,此列表仅包含一项或n项,这取决于您的where子句和表中的数据。但是它正在返回一个列表。因此,请确保将您的视图强类型化为此类的集合。@model List<FCBViewModel>
<h2> @Model.Count() Bookings </h2>
@foreach(var item in Model)
{
<p>@item.VenueName</p>
<p>@item.BookingDate</p>
}
关于c# - LINQ连接两个表并返回列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35293306/