MVC3 Viewmodel和linq

时间:2012-10-30 23:16:16

标签: asp.net-mvc-3 viewmodel ienumerable

在网页中,我希望能够返回BlogCategoryName以及类别中的博客数量。例如

BlogNameX(3)
BlogNameY(4)
....

我正在使用实体框架并拥有博客类别类

namespace emoCard.Domain.Entities
{
   public class BlogCategory
   {

     public BlogCategory()
     {
        this.Blogs = new List<Blog>();
     }

     public int BlogCategoryID { get; set; }
     public string BlogCategoryName { get; set; }
     public string BlogCategoryDescription { get; set; }
     public int BlogCategoryOrder { get; set; }

     public List<Blog> Blogs { get; set; }

    }
}

我可以按照

的方式设置一个viewmodel
namespace emoCard.WebUI.Models
{

  public class BlogCategoryViewModel
  {
    public IEnumerable<BlogCategory> BlogCategories { get; set; }
  }
}

然后有一个看起来像

的控制器
public PartialViewResult BlogCategories()
    {

        BlogCategoryViewModel viewModel = new BlogCategoryViewModel
        {
            BlogCategories = repository.BlogCategories.Include(b => b.Blogs)
        };

        return PartialView(viewModel);
    }

然后,我可以在视图中计算每个类别中的博客数量。

这有效,但我有很多问题。这些是:

  • 我需要撤回所有信息(即我真的不需要博客信息只计算)。
  • 在视图中计算计数似乎不正确。

我想我需要更改我的viewmodel,以便我可以填充与每个类别相关联的博客类别和博客数量,然后创建一个linq查询,分类和博客计数,但不是所有博客信息。我认为新的viewmodel应该是

  public BlogCategoryMenuItem(BlogCategory blogCategories, int numberOfBlogs)
  {
    BlogCategories = blogCategories;
    NumberOfBlogs = numberOfBlogs;

  }

public class BlogCategoryViewModel
{
    public IEnumerable<BlogCategoryMenuItem> BlogCategoryMenuItem { get; set; }
}

我有两个问题:
这是解决我遇到的问题的最佳方法吗? 2.如何使用linq填充此viewmodel对象?
谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

在我的博客中,我使用存储过程来获取此信息:

SELECT [Category].Name,
       [Category].DisplayName,
       COUNT(pc.PostId) AS PostCount
FROM   [Category]
       LEFT JOIN PostCategory pc
            ON  pc.CategoryId = [Category].Id
GROUP BY
       [Category].Name,
       [Category].DisplayName

然后,我在Entity Framework中映射它,它生成一个“GetCategoryCountList_Result”类。

在我的cshtml视图中:

@model List<EdiBlog.Core.Entities.GetCategoryCountList_Result>
...
@if (Model.Count > 0)
        {
            foreach (var item in Model)
            {
                <li>
                    <a href="@Url.Content("~/Category/List/" + @item.Name)">@item.DisplayName <span class="count uiSideNavCount fr">@item.PostCount</span></a>
                </li>
            }
        }

答案 1 :(得分:0)

我会看一下Automapper,它旨在从实体创建视图模型。如果正确命名属性,它会自动执行映射。或者,您可以自己定义映射。可以在这里找到一些使用建议https://github.com/AutoMapper/AutoMapper

以下文章很好地介绍了基础知识http://visualstudiomagazine.com/articles/2012/02/01/simplify-your-projections-with-automapper.aspx

您只需定义实体和视图模型之间的映射,然后调用map,其简单如下:

Mapper.CreateMap<Customer, CustomerInfo>();
var CustomerInfo = Mapper.Map<Customer, CustomerInfo>(customer);

Automapper尝试根据命名约定匹配字段,然后根据实体中的值等设置值。