LINQ - 概述

世界各地的开发人员在查询数据时总是遇到问题,因为缺少定义的路径,需要掌握多种技术,如SQL,Web服务,XQuery等.

在Visual Studio 2008中引入并由Anders Hejlsberg设计,LINQ(语言集成查询)允许编写查询,即使不了解SQL,XML等查询语言也可以.可以为不同的数据类型编写LINQ查询.

LINQ查询示例

C#

using System;
using System.Linq;

class Program {
   static void Main() {
   
      string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"};
		
      //Get only short words
      var shortWords = from word in words where word.Length <= 5 select word;
	    
      //Print each word out
      foreach (var word in shortWords) {
         Console.WriteLine(word);
      }	 
		
      Console.ReadLine();
   } 
}

VB

Module Module1
   Sub Main()
      Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"}
     
      ' Get only short words
      Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word
     
      ' Print each word out.
	  
      For Each word In shortWords
         Console.WriteLine(word)
      Next
	  
      Console.ReadLine()
   End Sub
End Moduld

当编译并执行上述C#或VB代码时,它会产生以下结果 :

hello 
LINQ 
world

LINQ的语法

LINQ有两种语法.这些是以下几个.

Lamda(方法)语法

var longWords = words.Where( w &rArr; w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)

查询(理解)语法

var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10

LINQ的类型

下面简要介绍LINQ的类型.

  • LINQ to Objects

  • LINQ to XML(XLINQ)

  • LINQ to DataSet

  • LINQ to SQL(DLINQ)

  • LINQ to Entities

除此之外,还有一个名为PLINQ的LINQ类型,它是Microsoft的并行LINQ.

.NET中的LINQ架构

LINQ有3个 - 层次结构,其中最上层由语言扩展组成,而底层由数据源组成,这些数据源通常是实现IEnumerable< T>的对象.或IQueryable< T>通用接口.架构如下所示.

LINQ Architecture

查询表达式

查询表达式只是一个LINQ查询,以类似于SQL的形式表示,查询运算符如Select,Where和OrderBy.查询表达式通常以关键字"From"开头.

要访问标准LINQ查询运算符,默认情况下应导入命名空间System.Query.这些表达式是在声明性查询语法C#3.0中编写的.

下面是一个示例,用于显示完整的查询操作,包括数据源创建,查询表达式定义和查询执行./p>

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Operators {
   class LINQQueryExpressions {
      static void Main() {
      
         // Specify the data source.
         int[] scores = new int[] { 97, 92, 81, 60 };

         // Define the query expression.
         IEnumerable<int> scoreQuery = from score in scores where score > 80 select score;

         // Execute the query.
		 
         foreach (int i in scoreQuery) {
            Console.Write(i + " ");
         }
		 
         Console.ReadLine();
      }
   } 
}

编译并执行上述代码时,会产生以下结果 :

 
 97 92 81

扩展方法

在.NET 3.5中引入,扩展方法仅在静态类中声明,并允许在对象中包含自定义方法,以执行一些精确的查询操作来扩展类,而不是该类的实际成员.这些也可以重载.

简而言之,扩展方法用于将查询表达式转换为传统的方法调用(面向对象).

LINQ和存储过程之间的区别

LINQ和存储过程之间存在一系列差异.下面提到了这些差异.

  • 存储过程比LINQ查询快得多,因为它们遵循预期的执行计划./p>

  • 执行LINQ查询时很容易避免运行时错误,而不是与存储过程相比,因为前者具有Visual Studio的Intellisense支持以及完整在编译时进行类型检查.

  • LINQ允许通过使用.NET调试器进行调试,而不是存储过程.

  • 与存储过程相比,LINQ提供对多个数据库的支持,其中必须为不同类型的数据库重写代码.

  • 与部署一组存储过程相比,部署基于LINQ的解决方案简单易行.

需要LINQ

在LINQ之前,必须学习C#,SQL和将两者绑定在一起形成complet的各种API申请.因为,这些数据源和编程语言面临阻抗不匹配;感觉需要短编码.

以下是开发人员在LINQ出现之前查询数据时使用了多少种不同技术的示例.

SqlConnection sqlConnection = new SqlConnection(connectString);
SqlConnection.Open();

System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;

sqlCommand.CommandText = "Select * from Customer";
return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)

有趣的是,在特色代码行中,查询仅由最后两行定义.使用LINQ,相同的数据查询可以用可读的颜色编码形式编写,如下面提到的那样,也可以在很短的时间内完成.

Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;

LINQ的优点

LINQ提供了许多优势,其中最重要的是其强大的表现力,使开发人员以陈述方式表达. LINQ的其他一些优点如下所示.

  • LINQ提供语法突出显示,证明有助于在设计过程中发现错误时间.

  • LINQ提供IntelliSense,这意味着可以轻松编写更准确的查询.

  • 写作LINQ中的代码速度非常快,因此开发时间也大大缩短.

  • LINQ通过集成C#语言使调试变得简单.

  • 使用LINQ可以轻松查看两个表之间的关系,因为它具有分层功能,这使得能够在更短的时间内编写连接多个表的查询.

  • LINQ允许在查询许多不同的数据源时使用单个LINQ语法,这主要是因为它具有统一的基础.

  • LINQ是可扩展的,这意味着可以使用LINQ的知识来查询新的数据源类型.

  • LINQ提供了设备可以在单个查询中连接多个数据源,并将复杂问题分解为一组易于调试的简短查询.

  • LINQ为转换提供了简单的转换一种数据类型到另一种数据类型,如将SQL数据转换为XML数据.