【问题标题】:Handle relational data in classes without use of database [closed]在不使用数据库的情况下处理类中的关系数据[关闭]
【发布时间】:2013-07-11 18:39:53
【问题描述】:

我有一些关系数据,即

  1. 来源(有很多类别)
  2. 类别(有很多产品)
  3. 产品

现在,如何使用 c# 中的类来处理这个问题?

【问题讨论】:

    标签: c# oop


    【解决方案1】:

    只需将它们创建为 POCO(仅包含数据定义的简单 C# 类),例如

    class source
    {
        public List<category> Categories = new List<category>();
    }
    
    class category
    {
        public category(string name)
        {
            Name = name;
        }
    
        public string Name {get;set;}
    
        public List<product> Products = new List<product>();
    
    }
    
    class product
    {
        public product(string name)
        {
            Name = name;
        }
    
        public string Name { get; set; }
    }
    

    然后进行测试:

        static void test()
        {
            product spoon = new product("spoon");
    
            category cutlery = new category("cutlery");
            cutlery.Products.Add(spoon);
    
            source mystuff = new source();
            mystuff.Categories.Add(cutlery);
    
        }
    

    【讨论】:

      【解决方案2】:
      • Source 应该有一个 categories 的集合
      • Category 应该有一个 products 的集合。
      • Products 仅由 category 使用,并不“知道” 另外两个。

      【讨论】:

      • 这是一种选择,但关系可以是对称的:产品可以有一个类别属性,类别可以有一个来源属性。
      • 在数据表之间存在关系的上下文中使用数据集是否正确?
      【解决方案3】:

      您需要两个类CategoryProduct。每个Product 都有一个属性Category 属于它。 您可以将它们存储在Dictionary&lt;Category, List&lt;Product&gt;&gt; 中,然后您可以轻松查找给定类别的所有产品。

      这是一个可能的实现,您甚至可以将这些类用作字典中的键,因为它们会覆盖 GetHashCode

      public class Category
      {
          public int CategoryId { get; set; }
          public string Name { get; set; }
          public string Description { get; set; }
      
          public override int GetHashCode()
          {
              return CategoryId.GetHashCode();
          }
          public override bool Equals(object obj)
          {
              Category c2 = obj as Category;
              if (c2 == null) return false;
              return CategoryId == c2.CategoryId;
          }
      }
      
      public class Product
      {
          public int ProductId { get; set; }
          public string Name { get; set; }
          public string Description { get; set; }
          publlic Category Category { get; set; }
      
          public override int GetHashCode()
          {
              return ProductId.GetHashCode();
          }
          public override bool Equals(object obj)
          {
              Product p2 = obj as Product;
              if (p2 == null) return false;
              return ProductId == p2.ProductId;
          }
      }
      

      初始化(通常来自 DAL):

      var cat1 = new Category(){CategoryId=1,Name="ABC"};
      var cat2 = new Category(){CategoryId=2,Name="DEF"};
      
      var products1 = new List<Product>(){
          new Product(){ProductId=1,Name="Prod1",Category=cat1},
          new Product(){ProductId=2,Name="Prod2",Category=cat1},
          new Product(){ProductId=3,Name="Prod3",Category=cat1}
      };
      var products2 = new List<Product>(){
          new Product(){ProductId=4,Name="Prod4",Category=cat2},
          new Product(){ProductId=5,Name="Prod5",Category=cat2},
      };
      
      var categoryProducts = new Dictionary<Category, List<Product>>()
      {
          { cat1, products1},
          { cat2, products2}
      };
      

      现在您可以查找给定类别的所有产品:

      List<Product> products = categoryProducts[cat1];
      

      来源可能是List&lt;Category&gt;:

      var source = new List<Category>();
      // fill from DAL
      foreach(Category cat in source)
          foreach(Product product in categoryProducts[cat])
              Console.WriteLine("Category:{0} Product:{1}", cat.Name, product.Name);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多