为asp mvc框架构建自定义形状视图模型

时间:2009-09-28 13:08:44

标签: c# asp.net-mvc linq

我正在使用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查询,类定义等等......如果你能帮助我进行任何排序,也可以获得奖励积分,但我认为我应该能够解决这个问题。

感谢您的帮助。

2 个答案:

答案 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;
}