【问题标题】:Querying an ICollection in ViewModel在 ViewModel 中查询 ICollection
【发布时间】:2017-05-28 12:35:26
【问题描述】:

ASP NET MVC5 Web 应用程序,E.F.6,Visual Studio 2015

CategoryTrans 模型类是 Category 模型类中的一个虚拟 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 已正确填充。 我是在尝试做一些不可能的事情,还是只是语法错误?

【问题讨论】:

  • 你的language_id 是整数吧?
  • 您是否首先验证了b.language_id.Equals(culture) 这种情况是否有效?

标签: c# asp.net-mvc linq


【解决方案1】:

您忘记了选择中的语言 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;
    }
  }

【讨论】:

  • 看起来不过是一种不同的语法。事实上,我一直得到相同的 null 结果。
  • 你设置了Configuration.ProxyCreationEnabled = true;加载外键表?如果设置,则检查您是否能够从 CategoryTrans 获取数据
  • 我在视图中引用了错误的项目:@Html.DisplayFor(modelItem => item.CategoryTrans.name) 而它应该是 @Html.DisplayFor(Model => Model.CategoryTrans.name)。现在我在两个选择中都收到了 System.NullReferenceException 错误。
  • 问题是我不知道如何从填充的属性 List productList { get; 中获取 CategoryTrans.language_id.Equals(culture) 上的 CategoryTrans.name 过滤放; } 在视图模型中
【解决方案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; }
    }

不知道这是最好的还是唯一的方法,但可以按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2011-02-25
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多