LINQ连接两个表和返回列表

时间:2016-02-09 13:26:58

标签: c# mysql linq asp.net-core-mvc

更新:在评论中,我清楚地知道我在哪里感到困惑,所以尽管我不能将评论标记为答案,但这个问题已经解决了。实际上,当我使用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();

但是我又遇到了麻烦,因为这会将它设置为单个对象而不是列表。正式化问题:

如何从我在视图中使用的两个已连接表中返回对象列表?

谢谢!

2 个答案:

答案 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()