linq to sql 使用总结

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 控制并 访问所有数据实体。

 

ContractedBlock.gif ExpandedBlockStart.gif Code
var dbContext = new AccessDataContext())
var exData1
=dbContext.PGP_tExteriorDatas.FirstOrDefault(c => c.KeyId == keyId);
var exData2
=dbContext.PGP_tExteriorDataApplication.FirstOrDefault(c => c.KeyId == keyId);

var exData3
=dbContext.CoustemTalbe.FirstOrDefault(c => c.KeyId == keyId);

            

 

2、如何使用列名构建动态lambda查询表达式。

 在上面访问PGP_tExteriorData、PGP_tExteriorDataApplication、CoustemTable  实体是我们都用到

lambda 表达式 c => c.KeyId == keyId ,那么有没有一个方法可以将这三个数据访问方法放到一个公共的方法中呢。

这也是问题困扰我很久,开始只是用泛型一直得不到结果,后来使用expression tree后终于得以解决。

代码如下:

其中KeyId属性为数据表中的主键,使用共有属性。

ContractedBlock.gif ExpandedBlockStart.gif Code

        
public void DeleteApplicationEntity<T>(string KeyId) where T:class
        {
            
using (var db = new AccessDataContext())
            {
                
                T appEntity 
= db.GetTable<T>().SingleOrDefault<T>(GetLinqLambda<T>("KeyId", KeyId));
 
            }
        }

        
private  Expression<Func<T, bool>> GetLinqLambda<T>(string propertyName,string KeyId) where T : class
        {
            ParameterExpression paraExp 
= Expression.Parameter(typeof(T), "c");
            ConstantExpression leftExp 
= Expression.Constant(KeyId, typeof(string));
            Expression rightExp 
= Expression.Property(paraExp, propertyName);
            BinaryExpression binaryExp 
= Expression.Equal(rightExp, leftExp);
            Expression
<Func<T, bool>> queryLambda = Expression.Lambda<Func<T, bool>>(binaryExp, new ParameterExpression[] { paraExp });
            
return queryLambda;
        }

 

        如果对Expression Tree 的构建还没有理解,可以查看 System.Linq.Expressions 命名空间的相关介绍和方法,网上这方面的资料也很多可查找。

这样我们一个系统只需要一个访问方法完成对数据库各个表的数据查询访问。

 

调用方式如下:DeleteApplicationEntity<PGP_tExteriorData>("KeyID");

                    DeleteApplicationEntity<PGP_tExteriorDataApplication>("KeyID");

                    DeleteApplicationEntity<PGP_CoustemTable  >("KeyID");

 

以上是我在使用linq to sql 中得到的一点经验,希望给学习linq的新手有所帮助。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/netBlog/archive/2008/12/28/1364150.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值