当前位置: 代码迷 >> SQL >> Linq技术1:Linq to SQL和Devart Linq to SQL Model
  详细解决方案

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

热度:24   发布时间:2016-05-05 11:24:10.0
Linq技术一:Linq to SQL和Devart Linq to SQL Model

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)
        {
            var 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();
        }



数据库连接的定义是在目录下面的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的好处所在。



  相关解决方案