C# Linq简介
LInq是Language Integrated Query的简称,它是微软在.net framework 3.5里面新加入的特性,用以简化查询查询操作。它主要包含了3块,Linq to Object、Linq to SQL、Linq to XML,其中Linq to Object和对于对象的查询,Linq to XML则又提供了对XML格式数据的检索、设置等功能,其中值得关注的Linq to SQL是我们要重点掌握的,因为它改变了我们传统的对于SQL操作的认识。
一、Linq to Object
先上一段代码:
string[] contries = new string[] { "china", "russia", "american", "spain", "japan", "china" };
var query = from c in contries select c;//Linq to object
IEnumerator enumerator = query.GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
注意Linq to Object的语法,from c in contries select c ; // 这里的c任意起名,in后面的contries 为数组对象或者是列表、集合等对象,select c 与前面的c保持一致。这是Linq强大的地方,试想我们以前要想查询数组里面的每一个元素要写一层for循环然后循环输出。这里似乎看不出什么明显优势的地方,我们继续往下看。
var query = from c in contries select c;
替换为:
var query = from c in contries.Distinct() where c.Length == 5 orderby c ascending select c;
我们会发现利用linq可以很容易的像利用sql语句一样查询、排序,如果利用原始的技术可能要多些好几行代码!
再举个例子。
这是论坛某个坛友发的帖子,问如何用Linq进行分组查询。见linq分组统计。
我在里面给出了解答,当然了里面的List完全可以是从数据库中获取,我简单模拟了一下,代码如下。
定义1个实体类:
public class Product
{
public Product(string province, Int32 value)
{
this.Province = province;
this.Value = value;
} public string Province { get; set; }
public Int32 Value { get; set; }
}
然后在Main函数中输入:
var result = from p in list.AsEnumerable()
group p by p.Province into g
select new
{
g.Key,
SumValue = g.Sum(p => p.Value)
};
result.ToList().ForEach((i) =>
{
Console.WriteLine(i.Key + ":" + i.SumValue);
});
可以得到分组统计的结果。
再附一个简单排序的例子。linq排序
二、Linq to SQL
这是Linq技术的重头戏,当然现在有了EntityFramework等技术,但是我们还是可以关注一下。
我们新建两张表,很简单。
然后在项目中新建一个Linq to SQL类,切换到设计界面。同时打开服务资源管理器,添加数据连接,连接到数据库。拖动classInfo和studentInfo两张表到Linq to SQL类文件的设计界面,我们会发现关系替我们都准备的好好的。

OK,这时就可以写相应代码,进行添加操作了。
DataClasses1DataContext datacontext = new DataClasses1DataContext();
classInfo classInfo = new classInfo()
{
classId = 1,
className = "grade1"
};
datacontext.classInfo.InsertOnSubmit(classInfo); studentInfo studentInfo = new studentInfo()
{
studentId = "001",
studentName = "liming",
classId = 1
}; datacontext.studentInfo.InsertOnSubmit(studentInfo); datacontext.SubmitChanges();
这样就添加了1条班级记录和1条学生记录。
如果我们要删除一条学生记录怎么办?举个例子,键入如下代码:
DataClasses1DataContext datacontext = new DataClasses1DataContext();
studentInfo studentInfo = datacontext.studentInfo.Single(c => c.studentName == "liming");
datacontext.studentInfo.DeleteOnSubmit(studentInfo);
datacontext.SubmitChanges();
这样就把liming这个学生记录给删除了,很简单吧?
好,现在我们修改这个学生记录,把名字改成zhang3。
DataClasses1DataContext datacontext = new DataClasses1DataContext();
studentInfo studentInfo = datacontext.studentInfo.Single(c => c.studentName == "liming");
studentInfo.studentName = "zhang3";//直接赋新的值
datacontext.SubmitChanges();//提交更改就可以了
补充一点很重要的,就是如何用linq to sql来进行查询操作。
前面的Single其实就是一种查询操作,返回单个对象。
直接上一个linq带条件的分页查询实例:
DataClasses1DataContext datacontext = new DataClasses1DataContext(); var singleStudent = from s in datacontext.studentInfo
where s.studentName != "zhang3"
orderby s.classInfo descending
select s; IList<studentInfo> studentList = singleStudent.Skip(pageSize * (pageNumber - 1)).Take(pageSize).ToList();
foreach (studentInfo student in studentList)
{
Console.WriteLine("studentId:" + student.studentId + "studentName:" + student.studentName);
}
三、Linq to XML
以前我们操作XML一般都用XmlDocument、XmlReader等核心类去处理,关于这个我在点击打开链接这个帖子中已经简单总结了一把。这里我们看看Linq是怎么处理XML的。
1、创建XML
XElement contacts =
new XElement("Students",
new XElement("Student",
new XElement("Name", "Xiao Ming"),
new XElement("Phone", "99599",
new XAttribute("Type", "Home")),
new XElement("phone", "010-99599",
new XAttribute("Type", "Work")),
new XElement("Address",
new XElement("Street", "123 Street"),
new XElement("City", "123 City"),
new XElement("State", "1"),
new XElement("Postal", "0000000")
)
)
);
contacts.Save("test.xml");
你会发现,你只要记住XElement这一个核心类就可以使用Linq创建xml,而且编码的方式很轻松,就是在表达一个xml的层级关系。
效果如下:
<?xml version="1.0" encoding="utf-8"?>
<Students>
<Student>
<Name>Xiao Ming</Name>
<Phone Type="Home">99599</Phone>
<phone Type="Work">010-99599</phone>
<Address>
<Street>123 Street</Street>
<City>123 City</City>
<State>1</State>
<Postal>0000000</Postal>
</Address>
</Student>
</Students>
2、查询XML
还是用上面生成的XML来做测试,键入如下代码:
XElement root = XElement.Load("test.xml");
IEnumerable address = from el in root.Elements("Student").Elements("phone")
where el.Attribute("Type").Value == "Work"
select el;
foreach (XElement el in address)
{
Console.WriteLine(el.Value);
}
输出:010-99599。
四、Linq to DataTable
意思跟Linq to Object是一样的,应该属于Linq to Object的范畴,这里单独拿出来,分享一下。
举个例子,对两个DataTable的数据进行合并,原贴见:两个DataTable合并列。
先构造两个DataTable。
DataTable A = new DataTable();
A.Columns.Add("NameNumber", typeof(string));
A.Columns.Add("Type", typeof(string)); DataRow drA = null;
drA = A.NewRow();
drA["NameNumber"] = "111";
drA["Type"] = "Y";
A.Rows.Add(drA); drA = A.NewRow();
drA["NameNumber"] = "222";
drA["Type"] = "N";
A.Rows.Add(drA); DataTable B = new DataTable();
B.Columns.Add("NameNumber", typeof(string));
B.Columns.Add("Name", typeof(string));
B.Columns.Add("Address", typeof(string)); DataRow drB = null;
drB = B.NewRow();
drB["NameNumber"] = "111";
drB["Name"] = "张三";
drB["Address"] = "上海";
B.Rows.Add(drB); drB = B.NewRow();
drB["NameNumber"] = "222";
drB["Name"] = "李四";
drB["Address"] = "北京";
B.Rows.Add(drB);
然后我们通过Linq to DataTable进行合并。
var result = from p in A.AsEnumerable()
from q in B.AsEnumerable()
where p.Field<string>("NameNumber") == q.Field<string>("NameNumber")
select new
{
NameNumber = p.Field<string>("NameNumber"),
Type = p.Field<string>("Type"),
Address = q.Field<string>("Address")
};
result.ToList().ForEach(x => Console.WriteLine(x.NameNumber + "-" + x.Type + "-" + x.Address));
效果图下:
C# Linq简介的更多相关文章
- .NETCoreCSharp 中级篇2-3 Linq简介
.NETCoreCSharp 中级篇2-3 本节内容为Linq及其拓展方法.Linq中表达式树的使用 简介 语言集成查询(LINQ)是一系列直接将查询功能集成到C#语言的技术统称.数据查询历来都表示为 ...
- linq简介
语言集成查询(Language INtegrated Query,LINQ)是一项微软技术,新增一种自然查询的SQL语法到.NET Framework的编程语言中,可支持Visual Basic .N ...
- LINQ简介和LINQ to SQL语句之Where
LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性.已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感 ...
- c# in deep 之LINQ简介(1)
前两天公司进了一批书,在借阅jon skeet的c# in deep收获颇大,本书特点是介绍了不同版本的c#所增加的新特性.今天先写一下书中对linq的描述. 很多初学者在使用VS2010或2013写 ...
- 一、Linq简介
语言集成查询Language Integrated Query(LINQ)是一系列将查询功能集成到C#语言的技术统称. 传统数据查询的缺点: 简单的字符串查询,没有编译时类型检查或Intellisen ...
- LINQ教程一:LINQ简介
一.为什么要使用LINQ 要理解为什么使用LINQ,先来看下面一个例子.假设有一个整数类型的数组,找到里面的偶数并进行降序排序. 在C#2.0以前,如果要实现这样的功能,我们必须使用'foreach' ...
- LinQ 简介
LinQ是3.0新加的语法.用起来比较方便,我们可以使用较简单的方法来过滤数据和处理数据. 使用场景: 可以看到LINQ使用场景还是很多的.现在写项目基本都会用到. 在出现委托之前,我们来查找对象 在 ...
- 转:LINQ教程一:LINQ简介
原文地址:https://www.cnblogs.com/dotnet261010/p/8278793.html 一.为什么要使用LINQ 要理解为什么使用LINQ,先来看下面一个例子.假设有一个整数 ...
- Linq的简介和基础知识学习
学习LINQ之前,我们要知道LINQ是干什么,解决什么问题的,怎样学习? 一.LINQ简介 1.什么是LINQ? 什么是LINQ?LINQ中文翻译为语言集成查询(Language Integrated ...
随机推荐
- [每日一题] 11gOCP 1z0-053 :2013-10-12 RESULT_CACHE在哪个池?.............................44
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12657479 正确答案:B Oracle 11g 新特性:Result Cache , ...
- 提高你的Java代码质量吧:如果有必要,使用变长数组吧
一.分析 Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便. 二.场景 比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都有可能会有学生 ...
- [Javascript] Webpack Loaders, Source Maps, and ES6
Using ES6 To use ES6, we need loader. Modify webpack.config.js file: module.exports = { entry: './in ...
- I P 127.X.X.X 和 0.0.0.0
127.x.x.x 这是大家最熟悉不过的本地loopback地址,在windows和linux上等价于localhost. 我们习惯于使用127.0.0.1,实际上, 如果你在命令行下ping 127 ...
- 数据结构与算法分析(2)——表、栈和队列
抽象数据类型 抽象数据类型(ADT)是一系列操作的集合.诸如表.集合.图和他们的操作一起可以看做是抽象数据类型 表 List 表的实现有两种:数组和链表.数组实现的表在插入和删除操作上的花 ...
- 微信、微博、qq图标服务实现
实现原理:变化前的图标和变化后的图标在一张图片上,用这张图片作为背景,通过定义背景的位置来实现显示哪个图标,其中还带着滑动的动画效果. <!DOCTYPE html> <html l ...
- [转]div里table居中的问题 Div与body顶部间隙
本文转自:http://www.cnblogs.com/jinhui/archive/2008/09/24/1297729.html 将div的text-align设为center,然后将table的 ...
- 关于SWT/JFace的API文档
在CSDN上下了几个CHM格式的文档,下载的时候要付的分数还挺高,但是下载下来三个都不能用,左边罗列了所有的类和方法.双击按回车右边都没有内容. 真坑爹. >>>>>&g ...
- js数组求和
array1.reduce(callbackfn[, initialValue]) callback : 函数执行在数组中每个值 initialValue : 对象作为第一个参数回调的第一次调用使用 ...
- EL表达式---关系运算符
近来公司做html5页面的数据展现,发现集中使用了El表达式,而对于EL表达式,发现自己对于关系运算符的运用还存在很多不足,特此 查阅以前的书籍资料和从网上看一些大牛的笔记,总结如下: 首先El关系运 ...