日期:2014-05-18  浏览次数:21265 次

请教关于datagridview中显示多张表数据的问题
我有个员工表employee(string name,int departmentID),此处departmentID存的是部门ID,我还有一张部门表department(int departmentID,string departmentName),我现在做了一个列表界面要显示员工数据,列表中用的是datagridview控件,如果用Datatable查询的话,我只要关联表查询就可以了,但我现在不想用datatable,我想用实体类,如果这样的话,我的列表界面员工部门一栏肯定显示的是部门id,但我要显示的是部门名称,请问这种情况怎么处理?我看了nhibernate中处理的方法是在员工实体类中定义部门的映射,但这种方式,如果数据量大的话就会显示很慢,也有可能超时,我测试的时候查询15万条数据,说到这里有人会建议说这么多数据为什么不分页,我实际操作当中会考虑分页,但这里只是纯技术讨论,不考虑分页。
这种问题说白了也就是如何用实体类的方式展示多表查询的结果,请问你们是怎么做的?谢谢。

------解决方案--------------------
C# code
    struct employees
        {
            public int id{ get; set; }
            public string name{ get; set; }
            public string departmentName{ get; set; }
        }

DataTable dt=DBHelper.getEmployeeList();
List<employees> eList=mew List<employees>();
   for (int i = 0; i < dt.rows.count; i++)
            { 
employees e=new  employees();
e.name=dt.rows[0]["name"].tostring();
e.departmentName=dt.rows[0]["departmentName"].tostring();
eList.add(e);
   }
datagridview.DataSource=eList;

------解决方案--------------------
樓上說+1

1.先把2個表關聯數據讀取出來放進datatable裏面,
然後再把它轉成實體類;

2.分別把2個表的數據讀取到2個datatable裏面,
循環employee表轉化為實體類的時候,有部門id嘛,去department表內找對應的部門,給部門屬性賦值。
這個方面不會快!
------解决方案--------------------
你的实体类不能只是简单的对映到表!这是个误区。以你的这个例子来说,你员工的实体类就应该包括一个“部门ID”“部门名称”两个属性才对。
------解决方案--------------------
如果楼主使用 1、2楼的方法 建议楼主 组织数据的时候 将 <部门Id,部门名称> 记录下来
下次优先查找这个集合,如果没有再去查找数据库。这样能节约一点时间
我和三楼的意思差不多,但是这样两种方法用哪个取决于你的数据模式
如果你的部门很多,而且每次用到的部门很少 那么用我的方法
如果你的部门很少,而且基本上都用到了那么用3楼的方法