linq與linqtosql
⑴ 用LINQtosql創建Web應用系統(一)
在新的 Net Framework 平台上 Microsoft發布了LINQ(C# VB Net ) 集成語言查詢(Language Integrated Query) 也就是通過編程語言來查詢數據
*資料庫 (LINQ to SQL)
*DataSet 數據集(LINQ to Dataset)
*XML文檔 (LINQ to XML)
*實體對象 (LINK to Entities)
本文將演示如何在ASP NET 平台上 使用LINQ to SQL構建多層的Web應用程序 在當前的編程領域中 創建N Tier應用程序成為一般的要求 且 NET Framework 提供了靈活的支持 一般而言 N Tier應用程序畝鬧好有如下幾個層 表示層 業務邏輯層 數據訪問層 資料庫層 每一層均完成特定的任務 本篇文章中介紹的架構和經典的N Tier相似 不過資料庫層替換新的DataLinq 層 使用LINQ to SQL 完成數據操作
圖 基於LINQ to SQL的彎告N Tier架構
架構思考
如果你有大型ASP NET項目的經歷 你可能會注意到更多的時間花在寫組件代碼 而不是Web頁面代碼 有時 組件的設計和管理成為一個費時的過程 你可能正迅鉛遇到架構方面的問題 尋找最好的方式來設計Web應用程序
我寫這篇文章的想法是介紹一個好的設計模式 並不是得到一個結論或者聲明這是一個最好的N Tier應用程序的設計模式 因為對於架構設計 每一個開發人員總是有自己的觀點 所以任何合適的架構闡述都是有爭議的 然而 如圖 所示 分離不同的代碼到不同的層總是一個好的實踐 按這樣組織代碼 可以更方便地維護和擴展應用程序
在圖 中 你可以看到業務組件分割到不同的層 組織代碼最好的方法是為每一個業務組件創建不同的類庫(Class Library) Visual Studio允許在同一個Solution中創建多個項目 因此 我們可以在同一個Solution中加入ASP NET 應用程序和類庫Class Library項目 當你在編譯Solution時 每一個項目都會生成在bin目錄下生成一個assembly程序集文件 方法 我們可以手動復制 DLL文件到應用程序的bin目錄 方法 增加項目引用 當你編譯Solution時 第二種方法可以自動更新應用程序bin目錄的程序集文件 通過這種方式組織代碼 可以更容易修改/更新項目的特定代碼 也容易從不同的Server上遷移代碼 我不想深入探討架構 這里我通過截屏來解釋如何實現
假定你已經具備經典 層架構應用程序的設計經驗 我告訴你如何建立層與層之間的引用關系 接著你可以自己建立項目引用 圖 上的箭頭符號說明了不同層之間的交互 說明如下
( ) 數據訪問層引用Data Linq 層( 開源小組注 原文說還需要引用業務外觀(Business Facade)層 原文有誤)
( ) 業務外觀(Business Facade)層引用Data Linq 層和數據訪問層 因為業務外觀層使用Data Linq層的業務實體來創建表實體(後面進行詳細討論) 同時調用數據訪問層的方法
lishixin/Article/program/net/201311/12345
⑵ LINQ和LINQ to SQL有區別嗎之間關系是什麼
LINQ是集嫌手成化查詢語言,可以用於對集合進行查詢。
linq
to
sql是linq的擴老森展芹含嫌框架,支持linq針對SQL資料庫進行查詢(將查詢的條件轉化為SQL語句)
⑶ Linq和LinqtoSql有什麼區別一般做項目用哪種
Linq是微軟在.net3.0推出的一種新的數據訪問和處理的方式,來解決過去處理集合對象數據所遇到的種種困難。其中在C#3.0和VB9中分別引入了和SQL相似的Linq語法,使得現在操作各種數據對象變得非常容易而且可讀性更好。
Linq To Sql是微軟默認提供的LinqProvider的一種,其他的還有LinqToDataSet LinqToXml LinqToEntity等。
平時開發項目可以大量的使用linq,他會讓你在處理大量集合數據的時候提高效率。而Linq2Sql算是一個ORM框架,可以用來減輕數據訪問的負擔,如果你知道Hibernate之類的ORM框架的話,就很容易理解他了
⑷ 如何設置和獲取LinqToSQLLINQ to SQL 框架的主入口點DataContext的連接字元串
我不太理解你的意思Connect String應該是預先在xml里寫好的你所謂的動態 是動態什麼
⑸ LINQ到底有什麼強大功能,如何與vs結合,與資料庫相連的
linq有很多版本
對於集合的linq這個僅用來對集合操作
linqtosql這個可以連接資料庫
還洞知有linq to xml 等等。具體看教程,建議先看懂linq對集差腔合的納慶消操作
⑹ ASP.NET中的Linq怎麼用
21.1.1 准備數據源
既然LINQ可以查詢多種數據源和對象,這些對象可能是數組,可能是數據集,也可能是資料庫,那麼在使用LINQ進行數據查詢時首先需要准備數據源。
1.數組
數組中的數據可以被LINQ查詢語句查詢,這樣就省去了復雜的數組遍歷。數組數據源示例代碼如下所示。
string[] str = { "學習", "學習LINQ", "好好學習", "生活很美好" };
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
數組可以看成是一個集合,雖然數組沒有集合的一些特性,但是從另一個角度上來說可以看成是一個集合。在傳統的開發過程中,如果要篩選其中包含「學習」欄位的某個字元串,則需要遍歷整個數組。
2.SQL Server
在資料庫操作中,同樣可以使用LINQ進行資料庫查詢。LINQ以其優雅的語法和面向對象的思想能夠方便的進行資料庫操作,為了使用LINQ進行SQL Server資料庫查詢,可以創建兩個表,這兩個表的結構如下所示。Student(學生表):
S_ID:學生ID。
S_NAME:學生姓名。
S_CLASS:學生班級。
C_ID:所在班級的ID。
上述結構描述了一個學生表,可以使用SQL語句創建學生表,示例代碼如下所示。
USE [student]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Student](
[S_ID] [int] IDENTITY(1,1) NOT NULL,
[S_NAME] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[S_CLASS] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[C_ID] [int] NULL,
CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED
(
[S_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
為了更加詳細的描述一個學生所有的基本信息,就需要創建另一個表對該學生所在的班級進行描述,班級表結構如下所示。Class(班級表):
C_ID:班級ID。
C_GREAD:班級所在的年級。
C_INFOR:班級專業。
上述代碼描述了一個班級的基本信息,同樣可以使用SQL語句創建班級表,示例代碼如下所示。
USE [student]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Class](
[C_ID] [int] IDENTITY(1,1) NOT NULL,
[C_GREAD] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[C_INFOR] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_Class] PRIMARY KEY CLUSTERED
(
[C_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
上述代碼在Student資料庫中創建了一個班級表,開發人員能夠向資料庫中添加相應的信息以准備數據源。
3.數據集
LINQ能夠通過查詢數據集進行數據的訪問和整合;通過訪問數據集,LINQ能夠返回一個集合變數;通過遍歷集合變數可以進行其中數據的訪問和篩選。在第9章中講到了數據集的概念,開發人員能夠將資料庫中的內容填充到數據集中,也可以自行創建數據集。
數據集是一個存在於內存的對象,該對象能夠模擬資料庫的一些基本功能,可以模擬小型的資料庫系統,開發人員能夠使用數據集對象在內存中創建表,以及模擬表與表之間的關系。在數據集的數據檢索過程中,往往需要大量的if、else等判斷才能檢索相應的數據。
使用LINQ進行數據集中數據的整理和檢索可以減少代碼量並優化檢索操作。數據集可以是開發人員自己創建的數據集也可以是現有資料庫填充的數據集,這里使用上述SQL Server創建的資料庫中的數據進行數據集的填充。
21.1.2 使用LINQ
在傳統對象查詢中,往往需要很多的if、else語句進行數組或對象的遍歷,例如在數組中尋找相應的欄位,實現起來往往比較復雜,而使用LINQ就簡化了對象的查詢。由於前面已經准備好了數據源,那麼就能夠分別使用LINQ語句進行數據源查詢。
1.數組
在前面的章節中,已經創建了一個數組作為數據源,數組示例代碼如下所示。
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
上述代碼是一個數組數據源,如果開發人員需要從其中的元素中搜索大於5的數字,傳統的方法應該遍歷整個數組並判斷該數字是否大於5,如果大於5則輸出,否則不輸出,示例代碼如下所示。
using System;
using System.Collections.Generic;
using System.Linq; //使用必要的命名空間
using System.Text;
namespace _21_1
{
class Program
{
static void Main(string[] args)
{
string[] str = { "學習", "學習LINQ", "好好學習", "生活很美好" }; //定義數組
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < inter.Length; i++) //遍歷數組
{
if (inter[i] > 5) //判斷數組元素的值是否大於5
{
Console.WriteLine(inter[i].ToString()); //輸出對象
}
}
Console.ReadKey();
}
}
}
上述代碼非常簡單,將數組從頭開始遍歷,遍歷中將數組中的的值與5相比較,如果大於5就會輸出該值,如果小於5就不會輸出該值。雖然上述代碼實現了功能的要求,但是這樣編寫的代碼繁冗復雜,也不具有擴展性。如果使用LINQ查詢語句進行查詢就非常簡單,示例代碼如下所示。
class Program
{
static void Main(string[] args)
{
string[] str = { "學習", "學習LINQ", "好好學習", "生活很美好" }; //定義數組
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //定義數組
var st = from s in inter where s > 5 select s; //執行LINQ查詢語句
foreach (var t in st) //遍歷集合元素
{
Console.WriteLine(t.ToString()); //輸出數組
}
Console.ReadKey();
}
}
使用LINQ進行查詢之後會返回一個IEnumerable的集合。在上一章講過,IEnumerable是.NET框架中最基本的集合訪問器,可以使用foreach語句遍歷集合元素。使用LINQ查詢數組更加容易被閱讀,LINQ查詢語句的結構和SQL語法十分類似,LINQ不僅能夠查詢數組,還可以通過.NET提供的編程語言進行篩選。例如str數組變數,如果要查詢其中包含「學習」的字元串,對於傳統的編程方法是非常冗餘和繁瑣的。由於LINQ是.NET編程語言中的一部分,開發人員就能通過編程語言進行篩選,LINQ查詢語句示例代碼如下所示。
var st = from s in str where s.Contains("學習") select s;
2.使用SQL Server
在傳統的資料庫開發中,如果需要篩選某個資料庫中的數據,可以通過SQL語句進行篩選。在ADO.NET中,首先需要從資料庫中查詢數據,查詢後就必須將數據填充到數據集中,然後在數據集中進行數據遍歷,示例代碼如下所示。
try
{
SqlConnection
con = new SqlConnection("server='(local)';database='student';uid='sa';pwd='sa'"); //創建連接
con.Open(); //打開連接
string strsql = "select * from student,class where student.c_id=class.c_id"; //SQL語句
SqlDataAdapter da = new SqlDataAdapter(strsql, con); //創建適配器
DataSet ds = new DataSet(); //創建數據集
int j = da.Fill(ds, "mytable"); //填充數據集
for (int i = 0; i < j; i++) //遍歷集合
{
Console.WriteLine(ds.Tables["mytable"].Rows[i]["S_NAME"].ToString()); //輸出對象
}
}
catch
{
Console.WriteLine("資料庫連接錯誤"); //拋出異常
}
上述代碼進行資料庫的訪問和查詢。在上述代碼中,首先需要創建一個連接對象進行資料庫連接,然後再打開連接,打開連接之後就要編寫SELECT語句進行資料庫查詢並填充到DataSet數據集中,並在DataSet數據集中遍歷相應的表和列進行數據篩選。如果要查詢C_ID為1的學生的所有姓名,有三個辦法,這三個辦法分別是:
修改SQL語句。
在循環內進行判斷。
使用LINQ進行查詢。
修改SQL語句是最方便的方法,直接在SELECT語句中添加查詢條件WHERE C-ID=1就能夠實現,但是這個方法擴展性非常的低,如果有其他需求則就需要修改SQL語句,也有可能造成其餘代碼填充數據集後數據集內容不同步。
在循環內進行判斷也是一種方法,但是這個方法當循環增加時會造成額外的性能消耗,並且當需要擴展時,還需要修改循環代碼。最方便的就是使用LINQ進行查詢,在Visual Studio 2008中提供了LINQ to SQL類文件用於將現有的數據抽象成對象,這樣就符合了面向對象的原則,同時也能夠減少代碼,提升擴展性。創建一個LINQ to SQL類文件,直接將服務資源管理器中的相應表拖放到LINQ to SQL類文件可視化窗口中即可,如圖21-1所示。
圖21-1 創建LINQ to SQL文件
創建了LINQ to SQL類文件後,就可以直接使用LINQ to SQL類文件提供的類進行查詢,示例代碼如下所示。
linqtosqlDataContext lq = new linqtosqlDataContext();
var mylq = from l in lq.Student from cl in lq.Class where l.C_ID==cl.C_ID select l; //執行查詢
foreach (var result in mylq) //遍歷集合
{
Console.WriteLine(result.S_NAME.ToString()); //輸出對象
}
上述代碼只用了很短的代碼就能夠實現資料庫中數據的查詢和遍歷,並且從可讀性上來說也很容易理解,因為LINQ查詢語句的語法基本與SQL語法相同,只要有一定的SQL語句基礎就能夠非常容易的編寫LINQ查詢語句。
3.數據集
LINQ同樣對數據集支持查詢和篩選操作。其實數據集也是集合的表現形式,數據集除了能夠填充資料庫中的內容以外,開發人員還能夠通過對數據集的操作向數據集中添加數據和修改數據。前面的章節中已經講到,數據集可以看作是內存中的資料庫。數據集能夠模擬基本的資料庫,包括表、關系等。這里就將SQL Server中的數據填充到數據集即可,示例代碼如下所示。
try
{
SqlConnection
con = new SqlConnection("server='(local)';database='student';uid='sa';pwd='sa'"); //創建連接
con.Open(); //打開連接
string strsql = "select * from student,class where student.c_id=class.c_id"; //執行SQL
SqlDataAdapter da = new SqlDataAdapter(strsql, con); //創建適配器
DataSet ds = new DataSet(); //創建數據集
da.Fill(ds, "mytable"); //填充數據集
DataTable tables = ds.Tables["mytable"]; //創建表
var dslq = from d in tables.AsEnumerable() select d; //執行LINQ語句
foreach (var res in dslq)
{
Console.WriteLine(res.Field<string>("S_NAME").ToString()); //輸出對象
}
}
catch
{
Console.WriteLine("資料庫連接錯誤");
}
上述代碼使用LINQ針對數據集中的數據進行篩選和整理,同樣能夠以一種面向對象的思想進行數據集中數據的篩選。在使用LINQ進行數據集操作時,LINQ不能直接從數據集對象中查詢,因為數據集對象不支持LINQ查詢,所以需要使用AsEnumerable方法返回一個泛型的對象以支持LINQ的查詢操作,示例代碼如下所示。
var dslq = from d in tables.AsEnumerable() select d; //使用AsEnumerable
上述代碼使用AsEnumerable方法就可以讓數據集中的表對象能夠支持LINQ查詢。
21.1.3 執行LINQ查詢
從上一節可以看出LINQ在編程過程中極大的方便了開發人員對於業務邏輯的處理代碼的編寫,在傳統的編程方法中復雜、冗餘、難以實現的方法在LINQ中都能很好的解決。LINQ不僅能夠像SQL語句一樣編寫查詢表達式,LINQ最大的優點也包括LINQ作為編程語言的一部分,可以使用編程語言提供的特性進行LINQ條件語句的編寫,這就彌補了SQL語句中的一些不足。在前面的章節中將一些復雜的查詢和判斷的代碼簡化成LINQ應用後,就能夠執行應用程序判斷LINQ是否查詢和篩選出了所需要的值。
1.數組
在數組數據源中,開發人員希望能夠篩選出大於5的元素。開發人員將傳統的代碼修改成LINQ代碼並通過LINQ查詢語句進行篩選,示例代碼如下所示。
var st = from s in inter where s > 5 select s; //執行LINQ查詢
上述代碼將查詢在inter數組中的所有元素並返回其中元素的值大於5的元素的集合,運行後如圖21-2所示。
圖21-2 遍歷數組
LINQ執行了條件語句並返回了元素的值大於5的元素。LINQ語句能夠方便的擴展,當有不同的需求時,可以修改條件語句進行邏輯判斷,例如可以篩選一個平方數為偶數的數組元素,直接修改條件即可,LINQ查詢語句如下所示。
var st = from s in inter where (s*s)%2==0 select s; //執行LINQ查詢
上述代碼通過條件(s*s)%2==0將數組元素進行篩選,選擇平方數為偶數的數組元素的集合,運行後如圖21-3所示。
圖21-3 更改篩選條件
2.使用SQL Server
在LINQ to SQL類文件中,LINQ to SQL類文件已經將資料庫的模型封裝成一個對象,開發人員能夠通過面向對象的思想訪問和整合資料庫。LINQ to SQL也對SQL做了補充,使用LINQ to SQL類文件能夠執行更強大的篩選,LINQ查詢語句代碼如下所示。
var mylq = from l in lq.Student from cl in lq.Class where l.C_ID==cl.C_ID select l; //執行LINQ查詢
上述代碼從Student表和Class表中篩選了C_ID相等的學生信息,這很容易在SQL語句中實現。LINQ作為編程語言的一部分,可以使用更多的編程方法實現不同的篩選需求,例如篩選名稱中包含「郭」字的學生的名稱在傳統的SQL語句中就很難通過一條語句實現,而在LINQ中就能夠實現,示例代碼如下所示。
var mylq = from l in lq.Student from cl in lq.Class where l.C_ID==cl.C_ID where
l.S_NAME.Contains("郭") select l; //執行LINQ條件查詢
上述代碼使用了Contains方法判斷一個字元串中是否包含某個字元或字元串,這樣不僅方便閱讀,也簡化了查詢操作,運行後如圖21-4和圖21-5所示。
圖21-4 簡單查詢 圖21-5 條件查詢
LINQ返回了符合條件的元素的集合,並實現了篩選操作。LINQ不僅作為編程語言的一部分,簡化了開發人員的開發操作,從另一方面講,LINQ也補充了在SQL中難以通過幾條語句實現的功能的實現。從上面的LINQ查詢代碼可以看出,就算是不同的對象、不同的數據源,其LINQ基本的查詢語法都非常相似,並且LINQ還能夠支持編程語言具有的特性從而彌補SQL語句的不足。在數據集的查詢中,其查詢語句也可以直接使用而無需大面積修改代碼,這樣代碼就具有了更高的維護性和可讀性。
⑺ LINQ和LINQ to SQL有區別嗎之間關系是什麼
本質上沒什麼區別,都指的是同一種概念,專門為sqlserver資料庫服務,就像MySql專門為PHP量身打照一樣,大部分人為了上口一般叫Linq。
⑻ LINQ to SQL 和一般的查詢語句怎麼什麼區別
linq是面向對象的sql。也就是說,sql是向關系型資料庫的查詢,而linq實際上是對內存里的數據的查詢。
雖然linq原來是對象查詢,但經過ms的努力,可以通過表達式分析與實體到關系的映射(linq
to
sql),把linq轉換為sql語句或是對xml的查詢(linq
to
xml)。
因此,這種技術就成了對象到資料庫記錄的一個方便的映射、轉化與操作的工具,你再也不必去去根據不同的情況用字元串拼接的辦法生成sql,而是專心於對象模型的處理即可,你對於對象的修改最終都會被轉換為對應的update,
insert,
delete等sql語句,在你submit時全部提交到資料庫中。
綜爾言之,linq
to
sql是一個資料庫到對象結構的一個中間層,
他把對關系數據的管理轉變為對象的操作,屏蔽了麻煩的sql,而且,還可以得到vs強大的智能感知功能的幫助。
⑼ ORM是否必要
工程上沒有絕對必要的東西,但是工程上說,ORM是極有價值的東西。當年也有人覺得 ORM 浪費資源,思路不清晰,雖然用了 Hibernate ,還是直接寫 SQL ,手工操作。
什麼是ORM
ORM框架採用元數據來描述對象一關系映射細節,元數據一般采賀穗用XML格式,並且存放在專門的對象一映射文件中。
如何設計查詢、傳侍拍備入參數到IQuery
配置層XML來編寫SQL語句。該程序的主要業務不是集中在這些方面,而是只關注於接老毀口(僅針對IQuery)。對於XML層,可以自動地編寫代碼、復雜的SQL或人工干預,以及關於UI的復雜查詢可以手動處理。
最後:我覺得任何語言都是相通的吧,沒有什麼必要不必要。
⑽ Linq和LinqtoSql有什麼區別一般做項目用哪種
Linq是.net對集合處理的一種比較方便信派的形式。
C#語法上對Linq有很大的支持激散。
LinqtoSql是建立在Linq的基礎上,利用表達式樹,支持sql資料庫的一種orm。明坦氏