2017-05-28 9 views
0

ASP NET MVC5 WebアプリケーションでいるICollectionの照会、E.F.6、Visual Studioの2015はViewModelに

CategoryTransモデルクラスは、Categoryモデルクラスの仮想いるICollectionです。

カテゴリモデルクラスは、Productモデルクラスの仮想プロパティです。

public partial class Product 
{ 
    public int? ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public virtual Category Category { get; set; } 
} 

public partial class Category 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int? ParentID { get; set; } 
    public bool IsDeleted { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
    public virtual ICollection<CategoryTrans> CategoryTrans { get; set; } 
} 

public class CategoryTrans 
{ 
    [Key, Column(Order = 1)] 
    public int category_id { get; set; } 
    [Key, Column(Order = 2)] 
    public int language_id { get; set; } 
    [ForeignKey("category_id")] 
    public virtual Category categoryId { get; set; } 
    [ForeignKey("language_id")] 
    public virtual ISO_Languages languageId { get; set; } 
    public string name { get; set; } 
} 

CategoryTransには、カテゴリとISO_languages FKによって作成された複合PKがあります。テーブルをクエリしてproductviewmodelに商品や関連するカテゴリの翻訳を入力すると、Product.Category.CategoryTransコレクション内のすべての 'language_id'と共にすべてのカテゴリの翻訳が取得されます。

私がする必要があるのは、単一変換(CategoryTrans.name)ユーザー培養入力パラメータごととして

私はそれのようにViewModelにプロパティを設定することによって行うことができるはず:

public CategoryTrans CategoryTrans 
    { 
     get 
     { 
      HttpUtilities HttpHelper = new HttpUtilities(); 
      string culture = HttpHelper.getShortCulture(); 
      var CT = Product.Category.CategoryTrans.Select(x => new CategoryTrans 
      { 
       name = x.name 
      }) 
      .Where(b => b.language_id.Equals(culture)).FirstOrDefault(); 
      return CT; 
     } 

そして、閲覧中:

@Html.DisplayFor(modelItem => item.CategoryTrans.name) 

しかし、CategoryTrans ICollectionが正しく入力されていることがわかりますが、空の値が返され続けます。 私は何か不可能なことをしようとしているのですか、それとも構文の問題が間違っていますか?

+1

あなたの 'language_id'は整数ですよね? – User3250

+0

この条件が最初に働いていれば、 'b.language_id.Equals(culture)'を検証しましたか? – User3250

答えて

0

は、私は最終的には完全に新しいリストを返し、ローカライズされたカテゴリ名を表示するために担当し、

[NotMapped] public virtual string LocalizedCategoryName { get; set; }

製品のモデルクラスを追加し、2つのネストされたforeach文を設定することで問題を解決しましたローカライズされた製品:

private List<Product> _LocalizedProductList = new List<Product>(); 

public List<Product> LocalizedProductList 
    { 
     get 
     { 
      HttpUtilities HttpHelper = new HttpUtilities(); 
      string culture = HttpHelper.getFullCulture(); 
      int IsoCode = GenericUtilities.getIsoID(culture, db); 
      List<Product> localized = new List<Product>(); 

      foreach (Product p in _LocalizedProductList) 
      { 
       foreach (CategoryTrans c in p.Category.CategoryTrans) 
       { 
        if (c.language_id.Equals(IsoCode)) 
        { 
         Product x = new Product 
         { 
          ID = p.ID, 
          LocalizedCategoryName = c.name, 
          DateCreated = p.DateCreated, 
          DateExpire = p.DateExpire, 
          DateLastModified = p.DateLastModified, 
          Name = p.Name, 
          Description = p.Description, 
          IsApproved = p.IsApproved, 
          IsDeleted = p.IsDeleted, 
          ProductImages = p.ProductImages, 
          User = p.User 
         }; 
         localized.Add(x); 
        }; 
       } 
      } 
      return localized; 
     } 

     set { _LocalizedProductList = value; } 
    } 

これが最善の方法か、唯一の方法であるかはわかりませんが、意図した通りに動作します。

0

selectでlanguage_idを忘れました。しかし、依然としてクエリを最適化することはできます。

public CategoryTrans CategoryTrans 
{ 
    get 
    { 
     HttpUtilities HttpHelper = new HttpUtilities(); 
     string culture = HttpHelper.getShortCulture(); 
     var CT = Product.Category.CategoryTrans 
     .FirstOrDefault(b => b.languageId.Equals(culture)); 
     return CT; 
    } 
    } 
+0

異なる構文のように見えます。事実、私は同じヌルの結果を得ています。 – Luke

+0

Configuration.ProxyCreationEnabled = trueを設定しましたか。外部キーテーブルをロードするには?設定されている場合、** CategoryTrans ** –

+0

からデータを取得できるかどうかをチェックします。Viewで間違った項目を参照していました。@ Html.DisplayFor(modelItem => item.CategoryTrans.name)@Html.DisplayFor(Model => Model.CategoryTrans.name)。今私は両方の選択System.NullReferenceExceptionエラーが発生します。 – Luke