一个非常简单的Case
有两张表:产品类别表和产品表,它们是一对多的关系。
实体如下://产品
public class Product
{
  public int ID{get;set;}
  public int TypeID{get;set;}//这里就是外键关系
  public string Title{get;set;}
}//产品类别表
public class ProductType
{
  public int ID{get;set;}
  public string Title{get;set;}
  public List<Product> ProList{get;set;}
}
现需要查询出所有产品类别ID(TypeID)为 1的产品。
这时候应该以ProductType实体来作为操作对象,
因为显示产品数据的同时还要显示对应的产品类别名称,可能还需要更多有关产品类别的属性。这里是不是需要两次查询才能实现?
第一次:去ProductType表中执行一次查询,查询出ID为1的产品类别。
第二次:通过ProductType与Product表全连接查询,查询出所有TypeID为1的产品。这时候有了两张表数据,把第一张表的数据反射到ID,Title属性上,第二张表的数据反射到ProList属性上。
------------------------------------------------------------------------------------------------
不知道各位大牛是怎么来实现的,
现在的疑问就是如何在查询的时候,
通过传过来的ProductType实体,就知道要另外查询ProList这个属性。
增加另外一个属性?增加一个通用的多表查询方法?
求各位大牛教育,指点!

解决方案 »

  1.   

    你是先要用实体去查询吗。我的建议是你做好用SQl去实现链表查询完事返回DataSet或DataTable数据源,DataSet和DataTable比实体类查询块多了。这个你用过以后就会明白了。
      

  2.   

    可以延迟(懒惰)加载:
    public class ProductType
    {
      public int ID{get;set;}
      public string Title{get;set;}
      public List<Product> ProList
      {
        get
        {
          return db.Product.Where(x => x.TypeID == ID).ToList();
        }
      }
    }
      

  3.   

    如果用实体类 这个封装好像也反了。
    应该是这样吧:
    //产品
    public class Product
    {
      public int ID{get;set;}
      public ProductType TypeID{get;set;}//这里就是外键关系
      public string Title{get;set;}
    }//产品类别表
    public class ProductType
    {
      public int ID{get;set;}
      public string Title{get;set;}
      public List<Product> ProList{get;set;}我不知打这个字段是虚拟的还是真实的,我感觉这个字段没用。
    }查询的时候这个TypeID=ProductType查询方法(TypeID)这么写。调用方法时可以通过TypeID点出类别名称。
      

  4.   

    尽管下面这样的eager-load可以实现,不过不是特别推荐。
    var listProduct = db.Products.Include("ProductType").Where(p=>p.TypeID.Equals(1)).ToList();通常我会把Product与ProductType作为一个聚合处理,Product作为聚合的根,利用规约和仓储实现上面的查询。
      

  5.   

    我不喜欢用 public List<***> ***{get;set;}只是显示多表数据,可以用datatable,或是IList<obj[]>
      

  6.   

    cfx大哥的意思我明白了。你的意思是:当我要用到这个ProList的时候在让程序去查询,对吧?莫非NHibernate和entity framework 的延迟加载是类似这样的东西?
      

  7.   


    Lazy-load必须要Context作为支持,所以并不是那么随意的。
      

  8.   


    操作DataTable 和DataSet 这种强类型的东西 让我感觉有点硬编码的感觉。
    既然用了ORM  我觉得程序里不应该出现数据库层面上的东西,
    其实 我感觉 Product中的TypeId 也是数据库中的关系,应该换成ProductType实体类型,更为符合。不知道我这样理解对不对,还望大牛们指点。