Веб-приложение ASP NET MVC5, E.F.6, Visual Studio 2015

Класс модели CategoryTrans - это виртуальная коллекция ICollection в классе модели Category.

Категория модели класса - это виртуальное свойство в классе модели продукта.

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. При запросе таблиц и заполнении модели productview моделями товаров и переводами соответствующих категорий я получаю перевод ВСЕХ категорий (один «category_id» вместе со всеми «language_id» в коллекции Product.Category.CategoryTrans.

Мне нужно отфильтровать отдельный перевод (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 заполнена правильно. Я пытаюсь сделать что-то невозможное или это просто неправильный синтаксис?

0
Luke 28 Май 2017 в 15:35

2 ответа

Лучший ответ

Я в конце концов решил проблему, добавив

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

Классу модели продукта, отвечающему за отображение локализованного имени категории и установку двух вложенных циклов 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
Luke 29 Май 2017 в 22:36

Вы забыли на language_id в select. Но вы все равно можете оптимизировать свой запрос.

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
Jayakrishnan 28 Май 2017 в 12:41