一、本系列目标

      1、理解LINQ;

      2、能写得复杂的LINQ语句(比如:动态查询);

      3、理解表达式树及相关概念;

      4、熟练运用LINQ写出优美的代码(希望一起努力,最终达到);

二、LINQ为何物?

   LINQ之争的销烟已经退去,如今,LINQ已经成为C#开发人必备技术之一。很多人用它写出了优美的代码,它已经成为处理数据的一种全新开发方式,这也许是你选择.NET作为开发平台的福利之一。越来越多的开源库、框架都大量地使用LINQ。不管是出于提高自身技能还是读懂别人的代码,它都得是被你我拿下的一块石头。接下来我将向大家介绍它,谈谈自己的一些认识,如有不恰当的地方欢迎指正。

1、LINQ是什么?

  一个通用的、语言集成的查询工具。使用这个工具,可以访问来自内存对象(LINQ to Objects)、数据库(LINQ to SQL)、XML文件(LINQ to XML)、文件系统等多种数据源中的数据。它是 Visual Studio 2008 中引入的一组功能,可为 C# 和 Visual Basic 语言语法提供强大的查询功能,经受了时间的考验和沉淀。

  下面是查询内存对象数据源中数据传统方法和LINQ的写法:

       /// <summary>
/// 输出数组中小于5的元素
/// </summary>
public static void RraditionalMethod() {
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; //传统方法使用循环方式
List<int> lowNums = new List<int>();
for (int i = 0; i < numbers.Length; i++) {
if (numbers[i] < 5) {
lowNums.Add(numbers[i]);
}
} Console.WriteLine("Numbers < 5:");
foreach (var x in lowNums) {
Console.WriteLine(x);
}
} /// <summary>
/// 输出数组中小于5的元素
/// </summary>
public static void LinqMethod() {
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; //LINQ写法
var lowNums =
from num in numbers
where num < 5
select num; Console.WriteLine("Numbers < 5:");
foreach (var x in lowNums) {
Console.WriteLine(x);
}
}

    也许你认为,查询内存对象数据源中数据的LINQ方法没有给我再来什么好处(至少从示例来看,代码数量差不多)。别急!我们来看看数据库中数据的操作再接着讨论,在没有LINQ之前,我们查询数据库(这里特指关系型数据库)中的持久化数据时要使用SQL语句,写代码时那红红(字符串在VS里的颜色)的SQL语句肯定给你带来了不少的麻烦吧? 也许是拼写错了一个字母,也许是写错字母顺序、也许……,编译器确没有给我们任何的提示。结果就挨了一个运行时异常。在一个复杂的系统里,解决这个问题花掉几个小时的时间是很正常的,更糟糕的是同样的错误经常发生!!!但有了LINQ后,我们使用LINQ to SQL,这个麻烦不会再来骚扰你了。请看下面的的示例,看你心动不心动。

        /// <summary>
/// 查询订单编号少于5的订单号 传统写法
/// </summary>
/// <param name="connectionString"></param>
private static void ReadOrderData(string connectionString) {
string queryString =
"SELECT * FROM dbo.Orders WHERE OrderID<5;";
using (SqlConnection connection = new SqlConnection(
connectionString)) {
SqlCommand command = new SqlCommand(
queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
try {
while (reader.Read()) {
Console.WriteLine(String.Format("{0}, {1}",
reader[0], reader[1]));
}
}
finally {
// 读完后关闭对象
reader.Close();
}
}
}
       /// <summary>
/// 查询订单编号少于5的订单号 LINQtoSQL写法
/// </summary>
public void ReadOrderDataByLinqToSql() {
var q =
from c in db.Orders
where c.OrderID <5
select c;
ObjectDumper.Write(q);
}

三、为什么要使用LINQ

    从上面的对比中我们可以看出,LINQ会给我们带来如下好处:

    1、集成化,它把查询封装成C#(VB.NET)语法,获取了跟别的C#(VB.NET)语法一样的,高亮显示、类型检查。

2、使用查询逻辑更加清晰。

    3、使用统一的查询语法处理内存对象、数据库、XML等数据源中的数据;

    4、提高了开发速度(上面的LINQ TO SQL示例);

    5、提高代码的可维护性、可扩展性(后面会介绍);

    别外,LINQ TO SQL可以有效的防止SQL注入,从来提高的系统的安全性。今天不早了,先洗洗睡了以防触死。如果对你有帮助,请点推荐支持,增加后面写作动力。如果有什么不当之处,再次恳请指正。

白话LINQ系列1---什么是LINQ?的更多相关文章

  1. 【转】Entity Framework技术系列之7:LINQ to Entities

    前言 LINQ(Language Integrated Query,语言集成查询)是一组用于C#和VB.NET语言的扩展,它允许编写C#或者VB.NET代码,以与查询数据库相同的方式操作内存数据. L ...

  2. LinQ系列文章

    温故而知新,想着系统再学习一次LinQ知识点,发现园子里有个非常棒的系列文章,所以Mark下来,方便以后查阅! 系列博客导航: LINQ之路系列博客导航 LINQ之路 1:LINQ介绍 LINQ之路 ...

  3. 转载LINQ系列OrderBy(), ThenBy()简介

    前言 前面两篇分别介绍了 Where() 与 Select() ,这篇则是要介绍 OrderBy() 与 ThenBy() ,这几个东西看起来最像 SQL 上会用到的语法,但切记一点,这边介绍的是 L ...

  4. C# LINQ系列:LINQ to DataSet的DataTable操作 及 DataTable与Linq相互转换

    LINQ to DataSet需要使用System.Core.dll.System.Data.dll和System.Data.DataSetExtensions.dll,在项目中添加引用System. ...

  5. LINQ系列:LINQ to ADO.NET概述

    LINQ to ADO.NET 包括两种独立的技术: LINQ to DataSet 和 LINQ to SQL. 使用 LINQ to DataSet 可以对DataSet 执行丰富而优化的查询,而 ...

  6. LINQ系列:LINQ to SQL Exists/In/Any/All/Contains

    1. Any 返回没有Product的Category var expr = from c in context.Categories where !c.Products.Any() select c ...

  7. Linq系列

    LINQ 图解 Linq中的Select——投影 Linq学习资源 Expert C# 5.0中的Linq部分

  8. 进阶系列(9)——linq

    一.揭开linq的神秘面纱(一)概述  LINQ的全称是Language Integrated Query,中文译成“语言集成查询”.LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组 ...

  9. Linq系列(7)——表达式树之ExpressionVisitor

    大家好,由于今天项目升级,大家都在获最新代码,所以我又有时间在这里写点东西,跟大家分享. 在上一篇的文章中我介绍了一个dll,使大家在debug的时候可以可视化的看到ExpressionTree的Bo ...

随机推荐

  1. 淘金客II项目问题日志(AngularJs+BootStrap+Api接口开发)

    问题二: 组件,如果是modal框,那么show的时候,是不会load它的(因为load有时候是需要传送数据的),需要别的组件去主动load它.那么问题来了:哪些框直接show,哪些框不仅需要show ...

  2. 不同版本vpb与osg对应关系

    不同版本vpb与osg对应关系 转自:http://blog.sina.com.cn/s/blog_668aae780101k6pr.html VirtualPlanetBuilder是一种地形数据库 ...

  3. nodeJS代码实现计算交社保是否合适

    本文通过nodejs的一个具体示例来对比分析现阶段我们交社保合不合适, 主要是对nodejs的一个小的应用,当然大家也可以改成其他语言的,程序猿们,来算算吧. 按一个普通程序员8000的月收入算就是1 ...

  4. 四种读写方案IO流 (JAVA)

    File类用于访问文件或目录的属性 流:指一连串流动的字符,是以先进先出的方式发送信息的通道.程序和数据源之间是通过流联系起来的. 第一套:字节流读取写入方案 FileInputStream :字节流 ...

  5. thinkphp3.2设置session的过期时间

    thinkPHP3.2中session的过期时间配置是不能使用的,我们需要修改一下它的配置文件thinkPHP>common>functions.php,找到这一行: if(isset($ ...

  6. JAVA 线程同步异步简单实例

    package test; public class testThread { public static void main(String[] args) { Example example = n ...

  7. android之消息机制(二)

    消息通道:Looper 首先编写main.xml文件 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk ...

  8. 织梦DEDECMS网站后台安全检测提示 加一个开关

    1.进入后台后,点击 系统->系统基本参数->添加变量: 变量名称:cfg_safecheck_switch 变量值:N 变量类型:布尔(Y/N) 参数说明:启用安全监测系统: 2.找到系 ...

  9. React学习一

    一.运行起来react 1.引入react库 引入对应的js即可,第三方cdn引入 <script src="https://cdnjs.cloudflare.com/ajax/lib ...

  10. 用Appium进行android自动化测试

    appium是开源的移动端自动化测试框架,可以测试ios,android应用.appium让移动端自动化测试不必限定在某种语言和某个具体的框架:也就是说任何人都可以使用自己最熟悉最顺手的语言以及框架来 ...