代码改变世界

LINQ TO SQL的使用感受

2010-08-27 10:00  gio.zhou  阅读(462)  评论(1编辑  收藏  举报

首先我先说下过去不是用LINQ TO SQL时的思路。

过去分为3层

Data

Bussiness

WebUI

还有一个Entity层进行作为承载数据的实体

返回数据在2家公司分别用过3种方式。

  1. Data层返回Datatable(sql多表查询的结果集)传到WebUI层,在WebUI层可以遍历整个Datatable的DataRow进行一些业务逻辑的判断
  2. Data层返回Entity(根据业务逻辑说建立的Entity)。一直传到WebUI可以遍历进行判断
  3. Data层返回Datatable(当表的结果集),传到Bussiness或WebUI,如果需要是多表的结合数据,那么用c#的merge等方法进行多个单表的合并。然后也可以遍历进行操作
但是这几天用了尝试了Linq to sql,我依然写了

Data

Bussiness

WebUI

这3个层
但是有个问题,如果是当表查询ok,在Data层如下代码
代码

public static IQueryable<Ic_Permission> GetPermissionList()
{
InfoCollectDBDataContext infoCollectDataContext
= new InfoCollectDBDataContext();
var obj_Ic_Permissions
= from a in infoCollectDataContext.Ic_Permissions select a;
return obj_Ic_Permissions;
}

 

这样我在WebUI或者Bussiness中可以进行遍历操作。如下代码
代码

IQueryable
<Ic_Permission> listIc_Permission = PerssionBussiness.GetPermissionList();
foreach (Ic_Permission ic in listIc_Permission)
{
if (ic.permission_name == "a")
{
Response.Write(ic.permission_name
+ "<br>");
}
else
{
Response.Write(ic.permission_name
+"asdf" + "<br>");
}
}

 

当然,可能有博友会说,你这个操作完全可以在取数据时可以处理好,没必要在前台去操作。我也知道是可以。比如过去写原生态SQL时,我也可以CASE WHEN 来操作。但是我个人原则是数据层就负责取数据,不加判断,只取我需要的数据。在Bussiness中或者WebUI在根据业务去处理数据。好了,不在这里较真。
但是问题出来了,我用LINQ TO SQL多表查询时就有问题了。如下代码
代码


public static IQueryable GetPermissionAndUserList()
{
InfoCollectDBDataContext infoCollectDataContext
= new InfoCollectDBDataContext();
var oo
= from a in infoCollectDataContext.Ic_Permissions
from b
in infoCollectDataContext.Ic_Users
where a.id == b.permission_id
select
new { uid = b.uid, permission_name = a.permission_name };
return oo;
}

 

OK,我把这个IQueryable返回到前台作为GridView2.DataSource。是可以显示了。但是往往我需要在前台还有很多操作。比如我要用foreach然后response.write时就无法操作。
那是不是说我该为这个业务定义一个Entity?然后刚才的代码如下修改,并新加一个类
代码

public class InfoEntity
{
public string Uid
{
get;
set;
}
public string Permission_Name
{
get;
set;
}
}

 

代码

public static IQueryable<InfoEntity> GetPermissionAndUserList()
{
InfoCollectDBDataContext infoCollectDataContext
= new InfoCollectDBDataContext();
var oo
= from a in infoCollectDataContext.Ic_Permissions
from b
in infoCollectDataContext.Ic_Users
where a.id == b.permission_id
select
new InfoEntity() { Uid = b.uid, Permission_Name = a.permission_name };
return oo;
}

 

这样,我就可以在WebUI和Bussiness也进行for遍历,也可以根据业务进行操作。
这样我是可以实现。
不过技术方面我不是很强。Ling to sql更是新学了2天。不知有没有更好的方法,我多表查询可以不用新建这么一个InfoEntity类。
或者有没有更好的方法,别的思路