2017-05-28 60 views
0

ASP NET MVC5 Web應用程序,E.F.6時,Visual Studio 2015年查詢在視圖模型的ICollection的

CategoryTrans模型類是分類模型類虛擬ICollection的。

類別模型類是產品模型類中的虛擬屬性。

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有一個由Category和ISO_languages FK組成的複合PK。當查詢表,並與產品及相關類別的翻譯填充productviewmodel我得到的所有類別的轉換(一個「CATEGORY_ID」與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; }

產品模型類,負責顯示本地化類別名稱,並設置兩個嵌套的foreach循環,返回的完全新的List的問題解決了本地化產品:

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

您在選擇中忘記了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