1、如何使用统一的DataContext 对象。
在使用2008 创建dbml类,每拖入个表格会创建一个与数据表名称一致的实体类:同时为每个dbml类自动生成一个继承
DataContext 类的自定义 DataContext 类。代码如下:PGP_tExteriorDatas、PGP_tExteriorDataApplications属性
返回PGP_tExteriorData、PGP_tExteriorDataApplication 实例。
public partial class AccessDataContext : System.Data.Linq.DataContext
{
public AccessDataContext(string connection) :
base(connection, mappingSource)
{
OnCreated();
}
public System.Data.Linq.Table<PGP.DataAccess.Entities.PGP_tExteriorData> PGP_tExteriorDatas
{
get
{
return this.GetTable<PGP.DataAccess.Entities.PGP_tExteriorData>();
}
}
public System.Data.Linq.Table<PGP.DataAccess.Entities.PGP_tExteriorDataApplication> PGP_tExteriorDataApplications
{
get
{
return this.GetTable<PGP.DataAccess.Entities.PGP_tExteriorDataApplication>();
}
}
}
由上面可以看到 AccessDataContext 和数据表实体对象并不存在依赖关系,我们只要在DataContext 自定义对象中添加一个 属性 并返回需要的数据表实体类型的 DataTable <T>类型即可。
例如在别dbml类中存在 CoutemTable 数据表实体。我们只需要在 AccessDataContext 类中添加如下代码即可:
public System.Data.Linq.Table<PGP.DataAccess.Entities.CoustemTable > CoustemTables
{
get
{
return this.GetTable<PGP.DataAccess.Entities.CoustemTable >();
}
}
这样我们就可以在同一DataContext 控制并 访问所有数据实体。
2、如何使用列名构建动态lambda查询表达式。
在上面访问PGP_tExteriorData、PGP_tExteriorDataApplication、CoustemTable 实体是我们都用到
lambda 表达式 c => c.KeyId == keyId ,那么有没有一个方法可以将这三个数据访问方法放到一个公共的方法中呢。
这也是问题困扰我很久,开始只是用泛型一直得不到结果,后来使用expression tree后终于得以解决。
代码如下:
其中KeyId属性为数据表中的主键,使用共有属性。
如果对Expression Tree 的构建还没有理解,可以查看 System.Linq.Expressions 命名空间的相关介绍和方法,网上这方面的资料也很多可查找。
这样我们一个系统只需要一个访问方法完成对数据库各个表的数据查询访问。
调用方式如下:DeleteApplicationEntity<PGP_tExteriorData>("KeyID");
DeleteApplicationEntity<PGP_tExteriorDataApplication>("KeyID");
DeleteApplicationEntity<PGP_CoustemTable >("KeyID");
以上是我在使用linq to sql 中得到的一点经验,希望给学习linq的新手有所帮助。