3

2つのテーブルを含むデータベースがあります

TABLE Categories (CategoriesId, Name, Description)
TABLE Products (ProductId, CategoriesId, Title, ProductImageUrl)

カテゴリは、CategoriesIdによって製品にリンクされています。

LINQを使用して特定のタイトルをすべて取得しようとしています。

 public ActionResult Browse(string categories)
 {
     var spices = spiceDB.Products.Include("Products").Single(p => p.Title == categories);                 
     return View(spices);
 }

製品モデル

namespace SpiceShop.Models
{
    public class Product
    {
        [Key]
        public int ProductId { get; set; }

        public int CategoriesId { get; set; }
        public string Title { get; set; }

        public string ProductImageUrl { get; set; }
        public List <Categorie> Name { get; set; }
    }
}

カテゴリモデル

namespace SpiceShop.Models
{
    public class Categorie
    {
        [Key]
        public int CategoriesId { get; set; }
        public string Name  { get; set; }

        public string Description { get; set; }
        //public List<Product> ProductId { get; set; }
        public List<Product> Products { get; set; }
    }
}
4

2 に答える 2

6

.Include( "Products")を削除するだけで、使用方法は異なります。

エラーは明らかです。「Product」モデルに「Products」プロパティがありません。

于 2013-02-28T01:00:35.260 に答える
4

編集:

ビューには、「製品」タイプの単一オブジェクトであるモデルが必要なようです。

また、各識別子/変数に、その意味と意図を最もよく伝える名前を付けようとしました。


編集2:

メソッドの入力パラメーター名を変更すると、そのメソッドを呼び出す View コードに対応する変更が必要になることに注意してください。
MVC では、Action-Method パラメーターは自動的にマップされます。
デバッグには の URL が表示されます。これは、入力パラメーターが「Sauces」に設定Browse?categories=Saucesされたメソッド「Browse」に自動的にマップされます。categoriesしかし(私のバージョンの)BrowseメソッドはcategoryName、ではなくパラメータを期待していますcategories。そのため、URL 属性とメソッド パラメーターがまったく同じ名前であることを確認する必要があります。


したがって、選択したカテゴリの名前を入力パラメータとして渡す必要がある場合は、次のようにします。

public ActionResult Browse(string categoryName)
{
    // Gets the CategoryId for the given categoryName, or zero if not found.
    var categoryId = spiceDB.Categories
        .Where(c => c.Name == categoryName)
        .Select(c => c.CategoriesId)
        .FirstOrDefault();

    // Gets the first Product (only) for the specified categoryId.
    var firstProduct = category.Products
        .FirstOrDefault(p => p.CategoriesId == categoryId);

    return View(firstProduct);
}

ただし、このタイプの「親子」関係をサポートするためのより一般的な使用シナリオは次のようになります。

  • カテゴリ リストをクリックすると、名前によるクエリではなく、ID によるクエリが呼び出されます (つまり、「Pickles」ではなく 3)。
  • あなたのビューは、最初のものだけでなく、関連するすべての Products をサポートします (つまり、List<Product>だけでなくタイプのモデルProduct)

例えば

public ActionResult Browse(int categoryId)
{
    var products = spiceDB.Products
        .Where(p => p.CategoriesId == categoryId) 
        .ToList();

    return View(products);
}

つまり、製品リストをより包括的にし、データ アクセス コードをよりシンプルかつ効率的にします。

于 2013-02-28T01:18:26.077 に答える