博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linq初探
阅读量:5274 次
发布时间:2019-06-14

本文共 2723 字,大约阅读时间需要 9 分钟。

1.什么是LINQ

LINQ是语言集成查询(Language Integrated Query),这项技术是在.net 3.5就已经引入的技术,极大的方便了数据的查询,他可以支持数据库、XML、ADO.NET、字符串等数据源,不必再为每一种数据源或者数据格式学习专门的查询语法,方便了开发人员的操作。

查询的基本流程:确定数据源-创建查询表达式-执行查询

一个简单的例子体验:

定义数据源:var  nums=new int[]{1,2,3,4,5,6,7,8,9,10};

创建查询表达式:var selectExp=from num in nums

                                             where num>5

                                           select num;

执行查询:foreach(var num  in selectExp)

                     Console.WriteLine(num);

数据源的获取方式有很多,比如

定义的字符串

string strs=nameString .Split(',');

使用ADO.Net获取的数据源

string sql="select count * from BookInfo";

DataAdapter da =new DataAdapter(conn,sql);

DataTabel dt=da.Fill(new DataSet()).Tables[0];

直接获取的文本文件

string[] strs=File.ReadAllLines(@"路径");

注意点:

1.关于创建查询表达式

查询表达式,只是记录了需要查询的语句,并没有从数据源了获取数据,也就是没有执行查询的操作,只是体现了一个存储的作用,这也就是“延迟执行”

2.关于可查询的类型

对于可以使用LINQ的类型,继承自接口IEnumrable<T>接口或者IQueryable<T>类型,所以对于其他的数据源,需要采用相关的技术,将数据源记载到指定的类型当中。例如LINQ TO XML ,需要将XML数据源加载到XElement类型中后,XElement dataElement=XElement.Load(@"class.xml")然后对这个类型进行相应的查询操作,其他的技术还有LINQ TO SQL等等

3.执行查询

多采用Foreach进行循环遍历,将结果查询出来,此时将会操作数据源,对于查询变量,只是用来记录查询的表达式的(重要的事情重复一遍),那么问题来了,有没有什么方法可以让查询立即执行而不是延迟呢?

使用ToList或者ToArray,直接将查询的结果保存在内存的变量中

var selectExp=(from num in nums

                                             where num>5

                                           select num).ToList();

2.初识LINQ

对于大多数人,看到LINQ相信都是感觉到异常的亲切吧,是不是感觉特别像SQL语句呢,他们确实很像,而且包括大多数的关键字的用法也都是一样的,只是在书写的顺序上存在一些的差异

一般的LINQ的查询语法主要形式:

var temp=from ss in Strs

              where ss=="小赵"

              select ss;

LINQ中的语法形式主要分为查询语法和方法语法,查询语法使用起来更加像SQL,更加的方便阅读,同时使用更见的灵活,但是方法语法更加的简洁,在.NET的CLR中并没有对查询语法的支持,CLR主要的机制就是方法的调用,所以CLR在编译的时候,会将查询语法转换方法语法的。而且在有些时候,使用查询语法很难办到的,比如说Max()、Count()等就比较麻烦,所以在使用的时候可以采用组合式的查询方式。对于聚合函数这类的方法,使用的时候本身就需要将数据在内部进行遍历,也就是已经调用过foreach语句了,所以也是属于立即执行的。

查询语法常用的关键字

select:对数据进行投影

where:where是用来进行书写条件进行过滤的

order by :用来进行排列查询的数据的顺序的(order by temp.ID ),如果想要使用倒叙排列的话,在后面添加desending即可

group... by:用来将数据源进行分组,不需要投影

List<Book> bookList=new List<Book>(){

new Book(){BookId=1,BookName="一个为什么",BookAuthor="nature"}

,new Book(){BookId=2,BookName="十个为什么",BookAuthor="nature"}

,new Book(){BookId=3,BookName="千个为什么",BookAuthor="nature1"}

,new Book(){BookId=1,BookName="万个为什么",BookAuthor="nature1"}

}

var books =from book in bookList

            group book by book.Author 

foreach(var bookGroup in books)

{

    Console.WriteLine(bookGroup.Key);

  foreach(var book in bookGroup)

    {

     Console.WriteLine(book.Name);

    }

}

如果想要对分组后的结果进行操作,可以使用into关键字

var bookExp =from book in bookList

            group book by book.Author 

           into bookGroup

         where bookGroup.Count()>0

       order by BookId

    select bookGroup

此外可以使用嵌套查询,也就是Sql中的子查询,进行操作

var bookExp=from bookGroup in ( from book in bookList group book by book.BookAuthor)

where bookGroup.Count==3

select bookGroup

join...in:连接,相当于SQL中的内连接

from book in bookList join price in priceList where price.ID==book.ID

select new { BookId=book.Id,BookName=book.Name,BookPrice=price.Price}

转载于:https://www.cnblogs.com/XZhao/p/6296723.html

你可能感兴趣的文章
java文件课后动手动脑
查看>>
EL表达式的语法与应用
查看>>
如何大幅提升web前端性能之看tengine在大公司架构实践
查看>>
Mybatis常见问题
查看>>
set
查看>>
PHP常用技术文之文件操作和目录操作总结
查看>>
laraval框架model注意事项
查看>>
十大著名的思想实验(程序员应该会读喜欢这些)
查看>>
C# 输出24小时格式时间
查看>>
ajax属性详解
查看>>
eclipse 快捷键.
查看>>
ZigBee简介
查看>>
HDU4810_Wall Painting
查看>>
BFS(最短路+路径打印) POJ 3984 迷宫问题
查看>>
商业智能BI汇总
查看>>
dbunit学习
查看>>
html 中input标签的name属性
查看>>
快乐,因为有你——五一苏行记(一)
查看>>
python学习笔记(18)异常处理
查看>>
Jstree 使用CheckBox插件 选中父节点时被禁用的子节点也会选中问题
查看>>