📜  LINQ-概述

📅  最后修改于: 2020-11-21 07:04:11             🧑  作者: Mango


由于缺少定义的路径,并且需要掌握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 Module    

编译并执行以上C#或VB的代码时,将产生以下结果-

hello 
LINQ 
world

LINQ的语法

LINQ有两种语法。以下是这些。

Lamda(方法)语法

var longWords = words.Where( w ⇒ 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对象
  • LINQ转XML(XLINQ)
  • LINQ转DataSet
  • LINQ to SQL(DLINQ)
  • LINQ到实体

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

.NET中的LINQ体系结构

LINQ具有三层体系结构,其中最上层由语言扩展组成,最下层由数据源组成,这些数据源通常是实现IEnumerable 或IQueryable 通用接口的对象。架构如下所示。

LINQ架构

查询表达式

查询表达式不过是LINQ查询,它以类似于SQL的形式表示,并带有诸如Select,Where和OrderBy之类的查询运算符。查询表达式通常以关键字“ From”开头。

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

下面是显示完整查询操作的示例,该操作由数据源创建,查询表达式定义和查询执行组成。

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 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查询要快得多。

  • 与存储过程相比,执行LINQ查询时更容易避免运行时错误,因为存储过程具有Visual Studio的Intellisense支持以及编译时的全类型检查。

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

  • 与存储过程相比,LINQ提供了对多个数据库的支持,在存储过程中,必须为多种类型的数据库重新编写代码。

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

极品飞车

在LINQ之前,必须学习C#,SQL和将两者绑定在一起以形成完整应用程序的各种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数据。