LINQ to SQL(1):基础入门

LINQ to SQL是在SQL SERVER数据库上设置一个强类型化界面的方式,LINQ to SQL提供的方式是目前我所见到查询SQL SERVER最简单也是最有效的方式,他可以使用自定义的类型与数据表甚至存储过程进行对应,而不像我们使用ADO.NET那样,把更多的功夫用在数据类型转换等等的问题上,当程序运行的时候,LINQ to SQL会将我们使用自己的语言定义的模型中的语言继承查询转换为SQL,然后将他在数据库上执行,然后将返回的结果转换为我们自定义的类对象,使用过nhibernate或者ibatis.net的朋友,可能就很熟悉这种方式啦,我个人认为,LINQ to SQL在某些地方弥补了这两种框架的缺陷,而且,如果我们可以在项目中使用ORM设计器来生成我们需要的模型,毫无疑问,那将会是一件非常幸福的事情,简单的介绍就写到这里,如果您还不了解LINQ是个什么东西,就必须先去看看LINQ的基础啦,当然,在我的这期博文里,不会用到太多复杂的LINQ语句

注意:本节以及以后的数据库示例,我想会放到文章最后,有兴趣的朋友可以直接下载,如果您有sql 2000/2005的示例数据库,就不需要啦 找到northwind(下载),附加到您的数据库就可以啦。我的环境是.net framework ,开发工具visual studio 2008 SP1 开发语言c#

创建一个控制台应用程序,在默认情况下,可能没有对System.Data.Linq的引用,所以,你懂得……

创建一个类,这里我们叫他Customers.cs,我们使用这个类来映射数据库中的Customers表,我们首先在类的顶部添加如下指令

using System.Data.Linq;
using System.Data.Linq.Mapping;

然后,我们只需要添加TableAttribute属性就可以实现映射关系啦,在类的内部,定义属性,使用ColumnAttribute标记属性在类中指定与数据中中的类的映射

[Table(Name="Customers")]
    public class Customers
    {
        private string _CustomerID;
        [Column(IsPrimaryKey=true,Storage="_CustomerID")]//IsPrimaryKey指定主键,Storage指定存储区域
        public string CustomerID
        {
            get { return this._CustomerID; }
            set { this._CustomerID = value; }
        }

        private string _City;
        [Column(Storage="_City")]
        public string City
        {
            get { return this._City; }
            set { this._City = value; }
        }
    }

好了,我们已经创建了一个类与一个Customers表进行映射,接来下就是LINQ to SQL中最最最重要的一个类出场啦DataContext,它是用于从数据库检索对象和提交更改的主要通道

在项目的Main方法中键入如下代码

DataContext dc = new DataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");

            Table<Customers> customers = dc.GetTable<Customers>();
            dc.Log = Console.Out;
            IQueryable<Customers> query = from c in customers
                                          where c.City == "London"
                                          select c;
            foreach (Customers c in query)
            {
                Console.WriteLine(c.CustomerID+" | "+c.City);
            }

这里需要注意的几点:

1.在构造DataContext实例对象的时候,传入的是一个连接字符串,当然,它还有好几种重载

2.真正的查询是在foreach的时候才真正开始的,在定义linq规则的时候,并没有查询

运行这段代码,得出的结果基本如下图所示

下面写一个有外键关系的两个表的链接查询

在Customers.cs中添加如下内容

[Table(Name = "Orders")]
    public class Order
    {
        private int _OrderID = 0;
        private string _CustomerID;
        private EntityRef<Customers> _Customer;
        public Order() { this._Customer = new EntityRef<Customers>(); }

        [Column(Storage = "_OrderID", DbType = "Int NOT NULL IDENTITY",
        IsPrimaryKey = true, IsDbGenerated = true)]
        public int OrderID
        {
            get { return this._OrderID; }
        }

        [Column(Storage = "_CustomerID", DbType = "NChar(5)")]
        public string CustomerID
        {
            get { return this._CustomerID; }
            set { this._CustomerID = value; }
        }

        [Association(Storage = "_Customer", ThisKey = "CustomerID")]
        public Customers Customer
        {
            get { return this._Customer.Entity; }
            set { this._Customer.Entity = value; }
        }
    }

修改上面我们定义的Customers类

[Table(Name="Customers")]
    public class Customers
    {
        private string _CustomerID;
        [Column(IsPrimaryKey=true,Storage="_CustomerID")]
        public string CustomerID
        {
            get { return this._CustomerID; }
            set { this._CustomerID = value; }
        }

        private string _City;
        [Column(Storage="_City")]
        public string City
        {
            get { return this._City; }
            set { this._City = value; }
        }

        private EntitySet<Order> _Orders;
        public Customers()
        {
            this._Orders = new EntitySet<Order>();
        }
        [Association(Storage="_Orders",OtherKey="CustomerID")]
        public EntitySet<Order> Orders
        {
            get { return this._Orders; }
            set { this._Orders = value; }
        }
    }

可以看到这里我们使用的是EntitySet和EntityRef来做主外键的关联的

修改Main方法中的代码

 DataContext dc = new DataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");

            var customers = dc.GetTable<Customers>();
            dc.Log = Console.Out;
            var query = from c in customers
                                          where c.Orders.Any()//只要有一个值
                                          select c;
            foreach (Customers c in query)
            {
                Console.WriteLine(c.CustomerID+" | "+c.Orders.Count);
            }

这样的代码,还并不是我们想要的,因为如果我们使用ORM来生成LINQ to SQL模型的话,是没有像GetTable这种东西出现的,二十在查询的时候,可以直接使用强类型话的类对象,那么他是如何实现的呢,继续往下看

在Customer.cs中命名空间下添加如下代码

 public class Northwind : DataContext
    {
        public Table<Customers> Customers;
        public Table<Order> Orders;
        public Northwind(string connection) : base(connection) { }
    }

这里,我们实现了一个强类型化的DataContext类,继承自DataContext类

修改Main方法中的代码

Northwind dc = new Northwind("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
 var customer = from c in dc.Customers
                           where c.Orders.Any()
                           select c;

            dc.Log = Console.Out;
            foreach (Customers c in customer)
            {
                Console.WriteLine(c.CustomerID + " | " + c.City);
            }

            Console.ReadKey();

这里我们使用了匿名类型var,在这里,其实它是一个实现了IQueryable接口的一个对象

这里我们已经不需要gettable这种方式啦,这样,我们就实现了一个简单的使用ORM设计器实现的LINQ to SQL模型,怎么样,LINQ to SQL的查询方式,是不是很让人心潮澎湃啊

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术之路

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇...

2019
来自专栏walterlv - 吕毅的博客

使用 C# 代码创建快捷方式文件

发布于 2015-04-07 04:48 更新于 2018-08...

901
来自专栏木宛城主

工欲善其事,必先利其器:分享一套Code Smith 搭建N层架构模板

 开篇 平常开发时,由于冗余代码过多,程序员做重复的工作过多势必会影响开发效率。倘若对重复性代码简单的复制、粘贴,虽然也能节省时间,但也需仔细一步步替换,这无...

1838
来自专栏菩提树下的杨过

silverlight + wcf(json格式) + sqlserver存储过程分页

silverlight并没有提供现成的分页控件,百度了一圈,也没有发现aspx中好用的类似AspNetPager成熟控件,网上现有的一些分页代码,很多也是基于1...

2167
来自专栏JadePeng的技术博客

使用Mongodb 做对象缓存

mongodb高效的访问速度,用来快速存取数据再合适不过了,缓存神马的,可以用这个的 另外,有的时候,如果仅仅存储几条数据,单独去建立一张表代价太大,这个时候,...

3375
来自专栏智能大石头

老瓶装新酒 - C#调用WM手机发送短信(源码)

一些系统,需要能够发送短信,量很小,平均每日10条。 运营商平台太贵,白名单很严格,小额只能发省内; 各短信平台有各种限制,大事件前后会关闭; 飞信以前可以用W...

1905
来自专栏james大数据架构

MVC利用MvcHtmlString在后台生成HTML

后台: /// <summary> /// 生成分类下拉-列表框,选中指定的项 /// </summary> /...

1836
来自专栏vue

FileStream类操作文件

  private void buttonselect_Click (object sender, EventArgs e)         {        ...

862
来自专栏大内老A

开发自己的Data Access Application Block[上篇]

经常在网上看到对ORM的讨论沸沸扬扬,我也来凑个热闹,谈谈我写的一个ORM。最近在做一项工作,把我们经常用到的一些业务逻辑抽象出来,写成一个个的Applicat...

1798
来自专栏Java职业技术分享

java爬虫带你爬天爬地爬人生,爬新浪

HttpClient是Apache Jakarta Common下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持...

1305

扫码关注云+社区