1

Web ページで、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; }
}

2 つの質問があります:
1. これは私が抱えている問題を解決する最善の方法ですか?
2. linq を使用してこのビューモデル オブジェクトを設定するにはどうすればよいですか?
ご協力いただきありがとうございます。

4

2 に答える 2

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 は、命名規則に基づいてフィールドの照合を試み、エンティティなどの値に基づいて値を設定します。

于 2012-10-31T08:56:42.030 に答える
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>
            }
        }
于 2012-10-31T08:56:25.593 に答える