當前位置:首頁 » 密碼管理 » 精通LINQ數據訪問技術

精通LINQ數據訪問技術

發布時間: 2022-07-09 10:11:12

1. C#的lINQ怎麼用干什麼用的

1.LINQ:Language Integrated Query 語言集成查詢。
2.LINQ通過對象的方式對資料庫進行描述。
3.LINQ是一種能夠快速對大部分數據源進行訪問和數據整合的一種技術,使用相同的基本查詢表達式模式類查詢和轉換sql資料庫、ADO.NET數據集、XML文檔和流已經.NET集合中的數據。
4.使用方法:
LINQ to Objects

LINQ to DataSet
LINQ to SQL
LINQ to Entities
LINQ to XML

2. LINQ的原理淺析

LINQ(Language Integrated Query)是Visual Studio 2008中的領軍人物。藉助於LINQ技術,我們可以使用一種類似SQL的語法來查詢任何形式的數據。目前為止LINQ所支持的數據源有SQL Server、Oracle、XML(標准通用標記語言下的一個應用)以及內存中的數據集合。開發人員也可以使用其提供的擴展框架添加更多的數據源,例如MySQL、Amazon甚至是GoogleDesktop。
一般來講,這類查詢語句的一個重要特點就是可以並行化執行。雖然有些情況下並行可能會帶來一些問題,但這種情況非常少見。這樣也就水到渠成地引出了PLINQ這個並行處理的LINQ類庫。
PLINQ原名為Parallel LINQ,支持XML和內存中的數據集合。執行於遠程伺服器上的查詢語句(例如LINQ to SQL)顯然無法實現這個功能。
將LINQ語句轉換為PLINQ語句極為簡單——只需要在查詢語句中From子句所指定的數據源的最後添加.AsParallel()即可。隨後Where、OrderBy和Select子句將自動改為調用這個並行的LINQ版本。
據MSDN Magazine介紹,PLINQ可以以三種方式執行。第一種是管道處理:一個線程用來讀取數據源,而其他的線程則用來處理查詢語句,二者同步進行——雖然這個單一的消費線程可能並不那麼容易與多個生產線程同步。不過若是能夠仔細配置好負載平衡的話,仍然會極大地減少內存佔用。
第二種模式叫做「stop and go」,用於處理結果集需要被一次返回時(例如調用ToList、ToArray或對結果排序)的情況。在這種模式下,將依次完成各個處理過程,並將結果統一返回給消費線程。這個模式在性能上將優於第一種模式,因為它省去了用來保持線程同步所花費的開銷。
最後一種方法叫做「inverted enumeration」。該方法並不需要實現收集到所有的輸出,然後在單一的線程中處理,而是將最終調用的函數通過ForAll擴展傳遞到每個線程中。這是目前為止最快的一種處理模式,不過這需要傳遞到ForAll中的函數是線程安全的,且最好不包含任何lock之類的互斥語句。
若是PLINQ中任意的一個線程拋出異常,那麼所有的其他線程將會被終止。若是拋出了多個異常,那麼這些異常將被組合成一個MultipleFailuresException類型的異常,但每個異常的調用堆棧仍會被保留。

3. 什麼是linq技術

LINQ,語言集成查詢(Language Integrated Query)是一組用於c#和Visual Basic語言的擴展。它允許編寫C#或者Visual Basic代碼以查詢資料庫相同的方式操作內存數據。
從技術角度而言,LINQ定義了大約40個查詢操作符,如select、from、in、where以及order by(C#中)。使用這些操作符可以編寫查詢語句。不過,這些查詢還可以基於很多類型的數據,每個數據類型都需要一個單獨的LINQ類型。
經過了最近 20 年,面向對象編程技術( object-oriented (OO) programming technologies )在工業領域的應用已經進入了一個穩定的發展階段。程序員現在都已經認同像 類(classes)、對象(objects)、方法(methods)這樣的語言特性。考察現在和下一代的技術,一個新的編程技術的重大挑戰開始呈現出來,即面向對象技術誕生以來並沒有解決降低訪問和整合信息數據( accessing and integrating information )的復雜度的問題。其中兩個最主要訪問的數據源與資料庫(database)和XML(標准通用標記語言下的一個應用)相關。
LINQ 提供了一條更常規的途徑即給.Net Framework添加一些可以應用於所有信息源( all sources of information )的具有多種用途( general-purpose )的語法查詢特性( query facilities ),這是比向開發語言和運行時( runtime )添加一些關系數據( relational )特性或者類似 XML 特性( XML-specific )更好的方式。這些語法特性就叫做 .NET Language Integrated Query (LINQ) 。

4. 誰有關於linq的資料,急需

在達人博客上看到的:是個系列,一共三篇,你去網路搜搜「LINQ to SQL、NHibernate比較」就能找到了。我給你轉第一篇。

LINQ to SQL、NHibernate比較(一)-- LINQ和NHibernate初體驗

1 引言

研發與資料庫打交道的系統的時候,最過於繁瑣的莫過於沒有編程快感的使用ADO.NET對後台資料庫進行操作,因為所有的資料庫連接、讀取、操作千篇一律,編程成為了體力活。

雖然我們可以設計自己的類作為資料庫訪問的持久層,但是每一個類都必須有不相同的SQL語句,這樣對於設計統一的資料庫讀寫類造成了很大的困難。

開發人員在這種情況下必須包辦窗體設計、方法設計、資料庫讀寫設計的過程,這樣加大了開發人員的負擔也使得項目的維護和後期開發變得難以進行。

2 .NET下的ORM解決方案

2.1 LINQ

2.1.1 LINQ簡介

作為微軟開發的查詢方案,LINQ 提供了一條更常規的途徑即給 .Net Framework 添加一些可以應用於所有信息源( all sources of information )的具有多種用途( general-purpose )的語法查詢特性( query facilities ),這是比向開發語言和運行時( runtime )添加一些關系數據( relational )特性或者類似 XML 特性( XML-specific )更好的方式。這些語法特性就叫做 .NET Language Integrated Query (LINQ) 。

如果覺得上面的解釋有點抽象,那麼可以這樣理解,LINQ其實就是提供了一套查詢功能,可以實現任何數據源的查詢,此處數據源不單指資料庫或者XML文件,而是任何集合或者實體,比如我們接觸各種編程語言都需要用到的數組,現在不用遍歷數組元素來尋找需要的項,LINQ可以實現這方面的查詢。

LINQ查詢數組:

圖2.1 LINQ查詢數組

上面是最簡單的LINQ實現對數組的查詢,泛型類型var在LINQ查詢中提供了強大的委託類型支持,不管查詢集合中項的類型(無論是int,char還是string或者類),我們只用一個var就可以保存LINQ查詢到的結果。程序結果如下:

圖2.2 LINQ查詢數組程序結果

是不是很方便,LINQ的應用遠遠不這些,通過不同的映射方案,我們可以實現對資料庫(LINQ To SQL),對XML文件(LINQ To XML)的訪問。

2.1.2 LINQ簡介

表2.1 LINQ的操作符

操作符
說明

聚合

Aggregate
對序列執行一個自定義方法

Average
計算數值序列的平均值

Count
返回序列中的項目數(整數)

LongCount
返回序列中的項目數(長型)

Min
查找數字序列中的最小數

Max
查找數字序列中的最大數

Sum
匯總序列中的數字

連接

Concat
將兩個序列連成一個序列

轉換

Cast
將序列中的元素轉換成指定類型

OfType
篩選序列中指定類型的元素

ToArray
從序列返回一個數組

ToDictionary
從序列返回一個字典

ToList
從序列返回一個列表

ToLookup
從序列返回一個查詢

ToSequence
返回一個 IEnumerable 序列

元素

DefaultIfEmpty
為空序列創建默認元素

ElementAt
返回序列中指定索引的元素

ElementAtOrDefault
返回序列中指定索引的元素,或者如果索引超出范圍,則返回默認值

First
返回序列中的第一個元素

FirstOrDefault
返回序列中的第一個元素,或者如果未找到元素,則返回默認值

Last
返回序列中的最後一個元素

LastOrDefault
返回序列中的最後一個元素,或者如果未找到元素,則返回默認值

Single
返回序列中的單個元素

SingleOrDefault
返回序列中的單個元素,或者如果未找到元素,則返回默認值

相等

SequenceEqual
比較兩個序列看其是否相等

生成

Empty
生成一個空序列

Range
生成一個指定范圍的序列

Repeat
通過將某個項目重復指定次數來生成一個序列

分組

GroupBy
按指定分組方法對序列中的項目進行分組

聯接

GroupJoin
通過歸組將兩個序列聯接在一起

Join
將兩個序列從內部聯接起來

排序

OrderBy
以升序按值排列序列

OrderByDescending
以降序按值排列序列

ThenBy
升序排列已排序的序列

ThenByDescending
降序排列已排序的序列

Reverse
顛倒序列中項目的順序

分區

Skip
返回跳過指定數目項目的序列

SkipWhile
返回跳過不滿足表達式項目的序列

Take
返回具有指定數目項目的序列

TakeWhile
返回具有滿足表達式項目的序列

投影

Select
創建部分序列的投影

SelectMany
創建部分序列的一對多投影

限定符

All
確定序列中的所有項目是否滿足某個條件

Any
確定序列中是否有任何項目滿足條件

Contains
確定序列是否包含指定項目

限制

Where
篩選序列中的項目

設置

Distinct
返回無重復項目的序列

Except
返回代表兩個序列差集的序列

Intersect
返回代表兩個序列交集的序列

Union
返回代表兩個序列交集的序列

Lambda 表達式

許多標准查詢操作符在對序列執行運算時都使用 Func 委託來處理單個元素。Lambda 表達式可與標准查詢操作符結合使用以代表委託。lambda 表達式是創建委託實現的簡略表達形式,並可用於匿名委託適用的所有場合。C# 和 Visual Basic® .NET 均支持 Lambda 表達式。但是,必須注意:由於 Visual Basic .NET 尚不支持匿名方法,Lambda 表達式可能僅包含一個語句。

上例中的的程序等同於下面

圖2.3 Lambda表達式的使用

2.2 NHibernate

說到NHibernate,就不得不提Hibernate,原因很簡單,Hibernate顧名思義就是Hibernate的.NET版本。

Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得java程序員可以隨心所欲的使用對象編程思維來操縱資料庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。

NHibernate作為Hibernate的.NET應用於Hibernate的實現完全相同,學習NHibernate完全可以直接學習Hibernate的資料。

事實上,雖然在Java資料庫映射領域Hibernate是使用最為廣泛的方案,但是在.NET中由於LINQ等映射方案(包括微軟下一代重量級的Entity Framework)的使用,NHibernate冷了許多。

NHibernate需要配置資料庫配置文件和類/表映射配置文件,所以使用NHibernate需要懂得XML文件的基礎知識,並且需要掌握比較復雜的XML文件配置節和相應的配置命令。

2.2.1 資料庫配置文件

NHibernate官方提供了配置文件的模板和實例可供我們參考。

圖2.4 NHibernate官方資料庫配置文件模板(對應了不同的資料庫)

上圖為資料庫配置文件。通常以「cfg.xml」作為後綴,一個示例的文件內容如下

圖2.5 資料庫配置文件示例

下面是一些在運行時可以改變NHibernate行為的其他配置。所有這些都是可選的,也有合理的默認值。

表2.2 NHibernate 配置屬性

屬性名
用途

hibernate.dialect
NHibernate方言(Dialect)的類名 - 可以讓NHibernate使用某些特定的資料庫平台的特性

例如: full.classname.of.Dialect(如果方言創建在NHibernate中), 或者full.classname.of.Dialect, assembly (如果使用一個自定義的方言的實現,它不屬於NHibernate)。

hibernate.default_schema
在生成的SQL中,scheml/tablespace的全限定名.

例如: SCHEMA_NAME

hibernate.prepare_sql
是否准備sql語句

例如: true | false

hibernate.session_factory_name
SessionFactory被創建後將自動綁定這個名稱.

例如: some.name

hibernate.use_outer_join
允許使用外連接抓取。

例如:true | false

hibernate.cache.provider_class
指定一個自定義的CacheProvider緩存提供者的類名

例如: full.classname.of.CacheProvider(如果ICacheProvider創建在NHibernate中), 或full.classname.of.CacheProvider, assembly(如果使用一個自定義的ICacheProvider,它不屬於NHibernate)。

hibernate.query.substitutions
把NHibernate查詢中的一些短語替換為SQL短語(比如說短語可能是函數或者字元)。

例如: hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC

2.2.2 實體映射配置文件

NHibernate官方開源包中提供了實體映射配置文件的實例可供我們參考。

圖2.6 NHibernate開源包中提供的實體映射配置文件

與資料庫配置文件一樣實體映射配置文件也是XML文件(XML果然是很強大啊,微軟下一代應用程序開發技術WPF就是使用XML文件將C/S和B/S長期分居的二人統一到一個屋檐下),所不同的是實體映射配置文件後綴是「hbm.xml」。

圖2.7 實體映射配置文件

實體映射配置文件所要配置的信息一般為

Ø Schema

所有的XML映射都需要使用nhibernate-mapping-2.0 schema。目前的schema可以在NHibernate的資源路徑或者是NHibernate.dll的嵌入資源(Embedded Resource)中找到。NHibernate總是會優先使用嵌入在資源中的schema文件。

Ø hibernate-mapping

(1)
schema (可選): 資料庫schema名稱.

(2)
default-cascade (可選 - 默認為 none): 默認的級聯風格.

(3)
auto-import (可選 - 默認為 true): 指定是否我們可以在查詢語言中使用非全限定的類名(僅限於本映射文件中的類)。

(4)
default-access (可選 - 默認為 property): NHibernate訪問屬性值時的策略。

(5)
assembly (可選): 指定一個程序集,如果在映射文檔中沒有指定程序集,就使用這個程序集。

(6)
namespace (可選): 指定一個命名空間前綴,如果在映射文檔中沒有指定全限定名,就使用這個命名空間名。

Ø class (1)
name: 持久化類(或者介面)的全限定名。

(2)
table: 對應的資料庫表名。

(3)
discriminator-value (可選 - 默認和類名一樣): 一個用於區分不同的子類的值,在多態行為時使用。

(4)
mutable (可選, 默認為 true): 表明該類的實例可變(不可變)。

(5)
schema (可選): 覆蓋在根<hibernate-mapping> 元素中指定的schema名字。

(6)
proxy (可選): 指定一個介面,在延遲裝載時作為代理使用。你可以在這里使用該類自己的名字。

(7)
dynamic-update (可選, 默認為 false): 指定用於UPDATE 的SQL將會在運行時動態生成,並且只更新那些改變過的欄位。

(8)
dynamic-insert (可選, 默認為 false): 指定用於INSERT的 SQL 將會在運行時動態生成,並且只包含那些非空值欄位。

(9)
polymorphism (可選, 默認為 implicit(隱式)): 界定是隱式還是顯式的使用查詢多態。

(10)
where (可選) 指定一個附加的SQL WHERE 條件,在抓取這個類的對象時會一直增加這個條件。

(11)
persister (可選): 指定一個定製的 IClassPersister.

(12)
lazy(可選):假若設置 lazy="true",就是設置這個類自己的名字作為proxy介面的一種等價快捷形式。

Ø id (1)
name (可選): 標識屬性的名字。

(2)
type (可選): 標識NHibernate類型的名字。

(3)
column (可選 - 默認為屬性名): 主鍵欄位的名字。

(4)
unsaved-value (可選 - 默認為 null): 一個特定的標識屬性值,用來標志該實例是剛剛創建的,尚未保存。這可以把這種實例和從以前的session中裝載過(可能又做過修改--譯者注)但未再次持久化的實例區分開來。

(5)
access (可選 - 默認為 property): NHibernate用來訪問屬性值的策略。

除此之外我們可以通過其他途徑深入了解配置方面的知識,一個NHibernate項目,配置文件的錯誤往往導致錯誤的結果甚至使得程序無法運行。

3 小結

本文初步介紹了LINQ to SQL和NHibernate,其中介紹NHibernate使用了較多的篇幅,因為相對LINQ to SQL而言NHibernate的使用入門門檻較高,配置較為復雜。關於LINQ to SQL、NHibernate優缺點將在後面文章中討論,不過從此處其實已經得出一點,那就是LINQ to SQL比NHibernate更加容易上手,節省了人員培訓的開銷。

5. 如何使用LINQ鏈接資料庫並操作資料庫

之前在遠標做過用JAVA連接資料庫主要有兩種方式,一是用JDBC-ODBC橋來連接,二是用相關廠商提供的相應驅動程序來連接,首先談談第一種連接。

JDBC-ODBC橋接器是用JdbcOdbc.Class和一個用於訪問ODBC驅動程序的本地庫實現的。對於WINDOWS平台,該本地庫是一個動態連接庫DLL(JDBCODBC.DLL)。

由於JDBC在設計上與ODBC很接近。在內部,這個驅動程序把JDBC的方法映射到ODBC調用上,這樣,JDBC就可以和任何可用的ODBC驅動程序進行交互了。這種橋接器的優點是,它使JDBC目前有能力訪問幾乎所有的資料庫。通行方式如圖所示:

應用程序---JDBC API---JDBC-ODBC---ODBC API---ODBC層---數據源

具體操作方法為:

首先打開控制面板的管理工具,打開數據源(ODBC),在用戶DSN裡面添加數據源(即你要連接的資料庫的名字),在這里假定連接SQL SERVER 2000的GoodsSupply資料庫。名稱填寫你要連接的資料庫的名稱(GoodsSupply),然後逐步設置,如果選用了使用SQL-SERVER密碼認證的話,就要輸入相應的用戶名及密碼連接到資料庫。一路下一步設置完成。

在JAVA裡面編寫程序進行測試,在這里我的程序是讓用戶輸入任意的表名與與列名,把該列的所有數據輸出。源代碼如下:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.*;

public class ODBCBridge {

public static void main(String[] args) {
String url="jdbc:odbc:GoodsSupply";
Statement sm=null;
String command=null;
ResultSet rs=null;
String tableName=null;
String cName=null;
String result=null;
BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
try {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //載入驅動
}catch(ClassNotFoundException e){
System.out.println("Can not load Jdbc-Odbc Bridge Driver");
System.err.print("ClassNotFoundException:");
System.err.println(e.getMessage());
}
Connection con=DriverManager.getConnection(url,"USER","PASSWORD"); //使用SQL-SERVER2000認證
DatabaseMetaData dmd=con.getMetaData(); //DMD為連接的相應情況
System.out.println("連接的資料庫:"+dmd.getURL());
System.out.println("驅動程序:"+dmd.getDriverName());
sm=con.createStatement();
System.out.println("輸入表名");
tableName=input.readLine();
while(true) {
System.out.println("輸入列名(為空時程序結束):");
cName=input.readLine();
if(cName.equalsIgnoreCase(""))
break;
command="select "+cName+" from "+tableName;
rs=sm.executeQuery(command); //執行查詢
if(!rs.next())
System.out.println("表名或列名輸入有誤");
else {
System.out.println("查詢結果為:");
do
{
result=rs.getString(cName);
//資料庫語言設置為中文,不用轉換編碼
//result=new String(result.getBytes("ISO-8859-1"),"GB2312");
System.out.println(result);
}while(rs.next());
}
}
}catch(SQLException ex) {
System.out.println("SQLException:");
while(ex!=null) {
System.out.println("Message:"+ex.getMessage());
ex=ex.getNextException();
}
}catch(Exception e) {
System.out.println("IOException");
}
}
}

6. 為什麼要學習使用LINQ技術

首先要知道Linq 都有哪些知識點,這個可以自行網路;

  1. 對集合的查詢,篩選,排序,重新生成新的對象

  2. 多個集合的連接查詢

  3. Linq to SQL ,可以進行SQL查詢等操作, 可以忽略不同資料庫之間的差異;

    你要知道很多人不懂得sql語句的,更別說不同資料庫的sql語句;

  4. 推薦你看一下 ,自己搜索下面的條件

    Linq使用心得——SelectMany替代二重foreach循環

    可以看得出比你自己寫循環要方便很多;

5.推薦你把LINQ的幾十個操作符都看一下,知道是什麼功能,可以先會用,知道它能幹什麼,這個時候再具體討論它的意義,它該不該學習

6.下面是2個網址,有時間可以自行看一下它是什麼,然後再深究其學習的意義

http://www.cnblogs.com/foundation/archive/2009/01/05/1369371.html

http://www.cnblogs.com/lyj/archive/2008/03/24/1119671.html

熱點內容
dnf伺服器存放什麼信息 發布:2025-05-15 12:11:07 瀏覽:215
辦公室視頻劇本腳本 發布:2025-05-15 12:03:51 瀏覽:490
編譯失敗什麼意思 發布:2025-05-15 11:58:18 瀏覽:87
lcs腳本官網 發布:2025-05-15 11:56:15 瀏覽:88
三國志戰略版打9級礦什麼配置 發布:2025-05-15 11:41:29 瀏覽:953
安卓加速器怎麼關 發布:2025-05-15 11:38:16 瀏覽:465
密碼鎖壞了如何打開 發布:2025-05-15 11:30:19 瀏覽:838
怎樣增加共享文件夾連接數量 發布:2025-05-15 11:24:50 瀏覽:962
安卓如何關閉單應用音量 發布:2025-05-15 11:22:31 瀏覽:352
抖音電腦後台伺服器中斷 發布:2025-05-15 11:11:59 瀏覽:308