实体框架:选择不同的对象

时间:2016-06-14 14:18:57

标签: c# entity-framework linq

我正在使用Entity Framework进行数据访问和操作。我有以下课程:

public class ProductCategory
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [MinLength(5)]
    [MaxLength(45)]
    public string Name { get; set; }

    [Column("ParentId", TypeName = "int")]
    public int? ProductCategoryId { get; set; }
    public virtual ProductCategory Parent { get; set; }
    public ICollection<ProductCategory> SubCategories { get; set; }
}

现在我正在使用LINQ来查询所有类别的列表,包括相关的子类别(使用ParentId列),如下所示:

public async Task<IQueryable<ProductCategory>> GetAll()
{
    return await Task.Run(() => {
        return _db.ProductCategories.AsQueryable();
    });
}

当我运行此代码时,我得到以下结果:

[
  {
    "Id": 1,
    "Name": "Computers & Software",
    "Parent": null,
    "SubCategories": [
      {
        "Id": 2,
        "Name": "Tablets & E-Readers",
        "SubCategories": [
          {
            "Id": 8,
            "Name": "Apple iPad",
            "SubCategories": []
          },
          {
            "Id": 9,
            "Name": "Samsung",
            "SubCategories": []
          },
          {
            "Id": 10,
            "Name": "Other makes",
            "SubCategories": []
          }
        ]
      }
    ]
  },
  {
    "Id": 2,
    "Name": "Tablets & E-Readers",
    "Parent": {
      "Id": 1,
      "Name": "Computers & Software",
      "Parent": null
    },
    "SubCategories": [...]
  }
]

现在,问题在于第二个对象的名称为&#34;平板电脑&amp; E-读者&#34;已经存在于&#34; SubCategories&#34;的数组中。在数组的第一个对象中。我想看到第二个对象(DISTINCT),但无法使其正常工作。有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我认为您的数据存在问题。子类别(平板电脑和电子书阅读器不应具有 null 父级,就像现在的数据一样。 子类别表示有父级。 如果只想要父类别,您可以尝试这样的事情:

_db.ProductCategories.Where(cat=>cat.Parent == null).AsQueryable();

可能你会得到你想要的东西。它不会在主列表中选择子类别。

答案 1 :(得分:0)

那些额外的类别存在,因为它们在数据库中链接。

您需要编写一个查询来过滤它们,例如使用LINQ函数Except

{{1}}