我正在使用ASP.NET MVC构建我的前几个项目,并且我有一个来自2个表的项目列表。
使用书呆子晚餐的例子,这是我的问题。
让我们说我想要所有晚餐,将所有rsvp信息放在一个页面的列表中。
所以它会去
dinnername1
rsvp1 rsvp2
dinnername2
rsvp1 rsvp2 rsvp3
目前我正在使用这个linq带来我认为正确的数据
public IQueryable<Dinner> GetAllUserDinnersAndRSVPs(string userId)
{
return from dinner in db.Dinner
from rsvp in db.RSVP
where dinner.userId == userId
where rsvp.userId == userId
select dinner;
}
我认为这会带回正确数量的结果,但因为我只带回了晚餐类型,所以rsvp信息不会显示在集合中。
所以我认为我需要做的是构建一个自定义模型(类?),它将存储来自dinners表和rsvp表的所有信息,称为DinnerTask.cs
这基本上只是为两个表的每个列添加了一些属性,这意味着我可以在使用foreach渲染到页面之前在c#中对整个列表进行排序。
我想这个课程的定义就是这样的。
public class DinnersAndRSVPsModel
{
public int DinnerId { get; set; }
public string DinnerName { get; set; }
rest of fields for table 1......
public int RSVPId { get; set; }
public int RSVPInfo { get; set; }
rest of fields for table 2.......
}
我问这个问题,因为我认为这似乎是我做错了,希望有人可以指出我正确的方向来处理这样的数据。
我真的很感激这方面的任何例子,包括linq查询,类定义等等......如果你能帮助我进行任何排序,也可以获得奖励积分,但我认为我应该能够解决这个问题。
感谢您的帮助。
答案 0 :(得分:1)
我阅读了Linq in Action以帮助我找到这个解决方案,然后这篇文章也帮助了我
How do I group data in an ASP.NET MVC View?
我使用它的方法是添加自定义类型(类)
(借口错误的命名约定)
public class DinnerAndRsvpName
{
public string Dinnername { get; set; }
public string RSVPname { get; set; }
}
然后我将linq查询重写为此
return from dinner in db.Dinner
join rsvp in db.RSVPs on Dinner.id equals RSVP.DinnerId into DinnerRsvp
where dinner.userId == userId
from rsvp in DinnerRsvp.DefaultIfEmpty()
select new DinnerAndRsvpName
{
Dinnername = goal.name,
RSVPname = rsvp == default(RSVPs) ? "No RSVP" : rsvp.name
};
然后将模型视图更改为此
<ul>
<% foreach (var group in Model.GroupBy(item => item.Dinnername)) { %>
<li><%= Html.Encode(group.Key) %>
<ul>
<% foreach (var item in group) { %>
<li><%= Html.Encode(item.RSVPname) %></li>
<% } %>
</ul>
<% } %>
答案 1 :(得分:0)
我认为对象模型的结构应该是这样的,即Dinner会有一个RSVP列表。我可能是错的(我没有看过NerdDinner示例),但如果确实如此,那么您需要做的就是为晚餐指定加载选项以包含RSVP。
它看起来像这样:
public IQueryable<Dinner> GetAllUserDinnersAndRSVPs(string userId)
{
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Dinner>(d => d.RSVPs); //whatever property has the RSVPS
db.LoadOptions = options;
return from dinner in db.Dinner
where dinner.userId == userId
select dinner;
}