【问题标题】:MVC3 Viewmodel and linqMVC3 Viewmodel 和 linq
【发布时间】:2012-10-20 09:09:30
【问题描述】:

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

博客名称X(3)
博客名称Y(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; }

    }
}

我可以按照

的方式设置视图模型
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);
    }

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

这可行,但我有很多问题。它们是:

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

我认为我需要更改我的视图模型,以便我可以填充博客类别和与每个类别关联的博客数量,然后创建一个 linq 查询,该查询包含类别和博客计数但不是所有博客信息。我认为新的视图模型应该遵循

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

  }

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

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

【问题讨论】:

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


    【解决方案1】:

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

    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
    

    然后,我将其映射到实体框架中,生成一个“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>
                }
            }
    

    【讨论】:

      【解决方案2】:

      我会看看 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 尝试根据命名约定匹配字段,然后根据实体中的值等设置值。

      【讨论】:

      • 谢谢格雷姆。我的偏好是这样,因为我可以轻松地在单元测试中添加它,并且它可以更好地分割我的数据层和业务层。
      • 如果您认为这是最好的答案并且可以解决您的问题,您可以接受:)
      猜你喜欢
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多