更新:在评论中,我清楚地知道我在哪里感到困惑,所以尽管我不能将评论标记为答案,但这个问题已经解决了。实际上,当我使用ViewModel时,一切都运行正常,我只是没有在视图中正确使用它。谢谢你的帮助!
我在MVC6中建立一个网站。我试图创建一个linq语句,一起加入预订和会场表,然后返回任何即将发布的预订。我很高兴我的来自和加入的陈述以及我的过滤器。
我有以下代码:
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();
但是我又遇到了麻烦,因为这会将它设置为单个对象而不是列表。正式化问题:
如何从我在视图中使用的两个已连接表中返回对象列表?
谢谢!
答案 0 :(得分:0)
您可以使用视图模型类在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子句和表格中的数据。但它正在返回一个List。因此,请确保您的视图强类型为此类的集合。
@model List<FCBViewModel>
<h2> @Model.Count() Bookings </h2>
@foreach(var item in Model)
{
<p>@item.VenueName</p>
<p>@item.BookingDate</p>
}
答案 1 :(得分:0)
你有没有试过这个。
var resultMBSSize = (from obj1 in objname.GetAll()
join obj2 in objname2.GetAll()
on obj1.id equals
obj2.id
where obj1.brandID== argumentvalue
select new objname
{
id=obj1.ModifierBrandSelectionSizeID,
name = obj2.Name,
price = obj1.Price,
address = obj2.address
}).ToList()