非常帅气的Linq to sql

Linq是.NET 3里新增的东西,我在软件工程课程设计里初步应用到一点,而且主要用在Lambda表达式上,今天算是在好奇心驱动下尝试了一下在数据库方面的应用。

在数据库数据层自动化上,Linq强大地让我很惊喜。

文档看这里:http://msdn.microsoft.com/library/bb384429.aspx

微软的东西首先在微软的产品上用,我直接用Sql Server Express了,随便建了两个表(方法见:http://msdn.microsoft.com/zh-cn/library/ms247254.aspx)然后需要做的就是新建Linq to Sql项,然后把建好的表拖进来,一切都是可视化,so easy。

我无耻地发现,类似关联,外键这种东西,他直接给你分析出来了,而且可以任意修改,一切都是自动化的,华丽丽的微软。之后的代码操作异常简单,我只测试了查询和添加(具体代码见本文尾巴)。需要注意的问题是由于用的Sql Server Express而且文件是相对路径,造成的结果就是bin文件夹里一组数据库文件,工程目录下一组,默认用的是bin目录下的那一组。

但是对于其他数据库,因为微软一向不鸟,用起来就不太爽了。还好我找到一个Dblinq库(官方:http://dblinq.codeplex.com/)支持MySQL, PostgreSQL, Oracle, Ingres, SQLite, FireBird, and SQL Server。OK这个NB啦。不过到现在为止,这个东西还不能可视化。

但是,他有个自动生成代码的工具,已经可以让我们很方便地使用了。在下载完Dblinq包解压后,有个DbMetal.exe的文件,通过这个文件可以生成代码文件,具体怎么用就用DbMetal –help来看吧,我这里直接把我本地的Wordpress数据库当白鼠了。我的命令是

DbMetal.exe -provider=MySql -database:myblog -server:localhost -user:root -password:******(这个必须匿) -namespace:LinqTest -code:MyBlog.cs -sprocs

然后他帮我生成了个74Kb的文件,文件名是MyBlog.cs,生成的时候要注意的就是因为我用的是0.2.0.1版本,需要把MySql.Data.dll复制到DbMetal的根目录里。其他数据库的应该也差不多吧。

运行结果就不贴了,然后贴出我的测试代码:

using System;
using System.Linq;

#region MYSQL
using MySql.Data.MySqlClient;
#endregion

namespace LinqTest {
    class Program {
        static void Main(string[] args) {
            // MySql的初始化
            string connStr = @"server=localhost;database=myblog;user=root;pwd=******(这个同样要匿);port=3306";
            MySqlConnection conn = new MySqlConnection(connStr);
            var tm = new MyBLog(conn);
            // Sql Server Express 的初始化
            var t = new DataClassesDataContext();

            // 第一个表
            var rs1 = from sample in t.sample
                     select sample;
            foreach (var i in rs1) {
                Console.WriteLine("id: " + i.ID + " val: " + i.值);
            }

            // 第二个表
            var rs2 = from Sample2 in t.Sample2
                 where Sample2.相关ID > 1
                 select Sample2;
            var rl2 = rs2.ToList();
            foreach (var i in rl2) {
                Console.WriteLine("id: " + i.PID + " sid: " + i.相关ID + " date: " + i.日期);
            }

            // 插入操作
            Sample2 s2 = new Sample2() {
                PID = rl2.Last().PID + 1,
                相关ID = rl2.Last().相关ID,
                日期 = DateTime.Now
            };
            t.Sample2.InsertOnSubmit(s2); // 木有错,这样就标记为插入了
            t.SubmitChanges();// 因为之后没有查询,所以这里要Submit一下,否则不会进数据库

            // MySql和Dblinq
            var rs3 = (from WpCommentMeta in tm.WpCommentMeta
                        where WpCommentMeta.MetaID > 10
                        orderby WpCommentMeta.CommentID
                        select WpCommentMeta).Skip(3).Take(3);
            foreach (var i in rs3.ToList()) {
                Console.WriteLine("MetaID: " + i.MetaID + " CommentID: " + i.CommentID);
                Console.WriteLine("Key:\r\n" + i.MetaKey + "\r\nValue:\r\n" + i.MetaValue);
                Console.WriteLine("");
            }
        }
    }
}

另外,有个东西忘了提了。关于效率的问题。

第一次尝试Linq to Sql的时候我就有个疑问,他的效率怎么样?因为他可以有很多的筛选比如上文代码中的where和order,这个不是问题,问题是Skip和Take函数,我想如果每次都是把数据全select出来然后筛选效率必然很慢,我试了一下MySQL的这一段的调试(因为我的Sql Server是Express版的没有分析工具),我很惊喜地发现Linq最为神奇的地方在于在写完select的那一句的时候并没有连接数据库,Linq会在需要访问数据的时候从已知条件生成SQL语句从提交给数据库,然后处理就如上文,在 var rs3那一句并没有访问数据库,而是在rs3.ToList()执行时访问的数据库,并且在日志记录里生成的SQL语句为

SELECT `comment_id`, `meta_id`, `meta_key`, `meta_value`
FROM `myblog`.`wp_commentmeta`
WHERE (`meta_id` > 10)
ORDER BY `comment_id` LIMIT 3 OFFSET 3

可以看出,生成的SQL非常给力的。另外也是这个延迟执行的原因,SQL语句会在查询的时候提交,在t.Sample2.InsertOnSubmit(s2); 的后面要加上  t.SubmitChanges(); 因为之后没有查询,没有访问数据库,所以这里要Submit一下,否则内存里的对象不会提交,也就不会进数据库,这条记录就没有了。

Linq的体验暂时就到这里吧,非常神奇。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木宛城主

SharePoint 2013 创建 Site Collection

在之前的文章中,通过SharePoint Central Administration 创建了Web Application。在这篇文章中将继续SharePo...

22760
来自专栏王磊的博客

iBatis for net 框架使用

简介:ibatis 一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目,到后面发展的版本...

364100
来自专栏技术之路

【权限的思考】(一)使用反射实现动态权限

  每一个业务系统都会根据业务需要配置各种各样的权限,实现方式也是千差万别,各有各的优缺点。今天我们 利用反射来做一个小的权限管理Demo。也可以说是插件化的权...

22890
来自专栏圣杰的专栏

ABP入门系列(2)——领域层创建实体

这一节我们主要和领域层打交道。首先我们要对ABP的体系结构以及从模板创建的解决方案进行一一对应。网上有代码生成器去简化我们这一步的任务,但是不建议初学者去使用。...

26080
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出

昨天文章太过仓促没有补充导出的示例源码,在者当时弄到到很晚没时间做出导出功能,对阅读理解造成影响,现补充一份示例源码,顺便补充导出的功能说明,望理解 示例代...

54370
来自专栏.net core新时代

npoi批量导入实现及相关技巧

  批量导入功能对于大部分后台系统来说都是不可或缺的一部分,常见的场景-基础数据的录入(部门,用户),用批量导入方便快捷。最近项目需要用到批量导入,决定花点时间...

50750
来自专栏葡萄城控件技术团队

Wijmo 更优美的jQuery UI部件集:服务器端Grid魔法

在之前的一篇文章中,我们讨论了如何添加一大堆的超赞的功能到一个标准的HTML表,并把它转换成一个“grid”表格。今天我想要做的事情是向你展示如何将这些功能转到...

22460
来自专栏大内老A

谈谈分布式事务之三: System.Transactions事务详解[上篇]

在.NET 1.x中,我们基本是通过ADO.NET实现对不同数据库访问的事务。.NET 2.0为了带来了全新的事务编程模式,由于所有事务组件或者类型均定义在Sy...

22880
来自专栏ASP.NET MVC5 后台权限管理系统

已经重写,源码和文章请跳转http://www.cnblogs.com/ymnets/p/5621706.html

文章由于写得比较仓促 已经重写,源码和文章请跳转 http://www.cnblogs.com/ymnets/p/5621706.html  前言: 导入导出实...

32280
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(29)-T4模版

本节不再适合本系统,在58,59节已经重构。请超过本节 这讲适合所有的MVC程序 很荣幸,我们的系统有了体验的地址了。演示地址 之前我们发布了一个简单的代码生...

39970

扫码关注云+社区

领取腾讯云代金券