您的位置:首页 > 数据库

Linq技术一:Linq to SQL和Devart Linq to SQL Model

2014-05-23 11:17 218 查看
Linq技术是在C# 3.0里面发布的,最初包含Linq to SQL, Linq to Object 和Linq to xml。然后在4.0里面发布了DLR动态语言运行时,所以有了Linq动态实现方式。

介绍一下命名空间:

System.Linq;

System.Linq.Expressions;

System.XML.Linq;

System.Data.Linq;

介绍一下Linq相关的接口:

IEnumerable<T>, IQueryable<T>

任何继承了上面接口的对象都可以使用Linq技术。

先说Linq to SQL:

在Visual Studio 2010里面可以创建Linq To SQL类,直接在项目里面选择新增Linq to Sql即可。目前最新版本Visual Studio 2013里面也支持Linq to Sql,还多了几种选择:devart Entity Model, Devart Linq to SQL Model, Devart NHibernate Model. 来说一下Devart,Devart是Devart Software,一家软件公司,扩充了这些方法。可访问:http://forums.asp.net/t/1725858.aspx?New+Version+of+Devart+Entity+Developer+with+ENUM+Support+and+Other+Enhancements

Linq to SQL class和Devart Linq to SQL Model有些细微差别,如果是Linq to SQL class,可以直接把SQL stored procedure和function当作一个实体来操作,可以自己选择将哪些表添加到DBContext里面,但Devart是默认全部添加,不能添加SP和function。Linq to SQL不具有code first或model first的功能,默认操作是database first, 但Devart具有两种选择,这个可以算是Linq
to SQL的升级应用,微软可能选择停止更新Linq to SQL。



Microsoft Linq to SQL编辑窗口:



Devart编辑窗口:



Devart 新建窗口:



在操作上没有多大区别,看看具体增删改和查询怎么操作:

//实例化DBContext

OTPDataContext devartDB = new OTPDataContext();

DataClasses1DataContext dbContext = new DataClasses1DataContext();

//返回特定行数的列表

public IQueryable<DataListForDemo> GetList(int count)

{

var dataList = dbContext.DataListForDemos.Take(count);

return dataList;

}

//新增数据

public void insertDB(DataListForDemo model)

{

dbContext.DataListForDemos.InsertOnSubmit(model);

dbContext.SubmitChanges();

}

//删除数据

public void deleteData(DataListForDemo model)

{

dbContext.DataListForDemos.DeleteOnSubmit(model);

dbContext.SubmitChanges();

}

//修改单行数据

public void updateDBByID(DataListForDemo model)

{

DataListForDemo iModel = dbContext.DataListForDemos.Where(p => p.ID == model.ID).SingleOrDefault();

iModel.col1 = model.col1;

iModel.col2 = model.col2;

iModel.col3 = model.col3;

dbContext.SubmitChanges();

}

//修改多行数据

public void updateDBMulti(DataListForDemo model)

{

var iModel = dbContext.DataListForDemos.Where(p => p.col1 == model.col1);

foreach(DataListForDemo m in iModel)

{

m.col2 = model.col2;

m.col3 = model.col3;

}

dbContext.SubmitChanges();

}

//运行调试时或记录日志的方法:
dbContext.Log("Log Info:xxx");
dbContext.GetCommand(IQueryable); //返回Linq生成的SQL语句,非常方便调试或记录日志用


数据库连接的定义是在目录下面的app.config配置文件里面:
<connectionStrings>

<add name="UTConsoleApplication.Properties.Settings.OTPConnectionString"

connectionString="Data Source=localhost;Initial Catalog=OTP;Integrated Security=True"

providerName="System.Data.SqlClient" />

</connectionStrings>

可以看到name的值实际上是一个资源字符串,再看看Settings.Settings资源文件,打开Properties目录:
Key : OTPConnectionString
Value : Data Source=localhost;Initial Catalog=OTP;Integrated Security=True

数据库连接是在什么地方用到的呢?看看DBML下面的文件:

第一个无参数的构造函数,字符串放到了Base里面,
public DataClasses1DataContext() :

base(global::UTConsoleApplication.Properties.Settings.Default.OTPConnectionString, mappingSource)

{

OnCreated();

}

因为DataClasses1DataConext继承自DataContext,那么看看DataContext对应的数构造函数是什么:
//

// Summary:

// Initializes a new instance of the System.Data.Linq.DataContext class by referencing

// a file source and a mapping source.

//

// Parameters:

// fileOrServerOrConnection:

// This argument can be any one of the following:The name of a file where a

// SQL Server Express database resides.The name of a server where a database

// is present. In this case the provider uses the default database for a user.A

// complete connection string. LINQ to SQL just passes the string to the provider

// without modification.

//

// mapping:

// A source for mapping.

public DataContext(string fileOrServerOrConnection, MappingSource mapping);

因为是系统函数无法看到具体实现,但可以理解的是在DataContext里面的这个构造函数作了数据库连接的动作。

在designer.cs文件里面自动生成了实体类、和没有具体实现的增删改的部分方法(partial method)。所以只需要根据自己的需求写新方法就行,这就是ORM的好处所在。




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: