年終鉅獻 史上最全 ——LINQ to SQL語句
LINQ to SQL語句(1)之Where
適用場景:實現過濾,查詢等功能。
說明:與SQL命令中的Where作用相似,都是起到範圍限定也就是過濾作用的,而判斷條件就是它後面所接的子句。Where操作包括3種形式,分別為簡單形式、關係條件形式、First()形式。下面分別用例項舉例下:
1.簡單形式:
例如:使用where篩選在倫敦的客戶
var q = from c in db.Customers where c.City == "London" select c;
再如:篩選1994 年或之後僱用的僱員:
var q = from e in db.Employeeswhere e.HireDate >= new DateTime(1994, 1, 1) select e;
2.關係條件形式:
篩選庫存量在訂貨點水平之下但未斷貨的產品:
var q = from p in db.Products where p.UnitsInStock <= p.ReorderLevel && !p.Discontinued select p;
篩選出UnitPrice 大於10 或已停產的產品:
var q = from p in db.Products where p.UnitPrice > 10m || p.Discontinuedselect p;
下面這個例子是呼叫兩次where以篩選出UnitPrice大於10且已停產的產品。
var q = db.Products.Where(p=>p.UnitPrice > 10m).Where(p=>p.Discontinued);
3.First()形式:
返回集合中的一個元素,其實質就是在SQL語句中加TOP (1)。
簡單用法:選擇表中的第一個發貨方。
Shipper shipper = db.Shippers.First();
元素:選擇CustomerID 為“BONAP”的單個客戶
Customer cust = db.Customers.First(c => c.CustomerID == "BONAP");
條件:選擇運費大於 10.00 的訂單:
Order ord = db.Orders.First(o => o.Freight > 10.00M);
LINQ to SQL語句(2)之Select/Distinct
適用場景:o(∩_∩)o… 查詢唄。
說明:和SQL命令中的select作用相似但位置不同,查詢表示式中的select及所接子句是放在表示式最後並把子句中的變數也就是結果返回回來;延遲。Select/Distinct操作包括9種形式,分別為簡單用法、匿名型別形式、條件形式、指定型別形式、篩選形式、整形型別形式、巢狀型別形式、本地方法呼叫形式、Distinct形式。
1.簡單用法:
這個示例返回僅含客戶聯絡人姓名的序列。
var q = from c in db.Customers select c.ContactName;
注意:這個語句只是一個宣告或者一個描述,並沒有真正把資料取出來,只有當你需要該資料的時候,它才會執行這個語句,這就是延遲載入(deferred loading)。如果,在宣告的時候就返回的結果集是物件的集合。你可以使用ToList() 或ToArray()方法把查詢結果先進行儲存,然後再對這個集合進行查詢。當然延遲載入(deferred loading)可以像拼接SQL語句那樣拼接查詢語法,再執行它。
2.匿名型別形式:
說明:匿名型別是C#3.0中新特性。其實質是編譯器根據我們自定義自動產生一個匿名的類來幫助我們實現臨時變數的儲存。匿名型別還依賴於另外一個特性:支援根據property來建立物件。比如,var d = new { Name = "s" };編譯器自動產生一個有property叫做Name的匿名類,然後按這個型別分配記憶體,並初始化物件。但是var d = new {"s"};是編譯不通過的。因為,編譯器不知道匿名類中的property的名字。例如string c = "d";var d = new { c}; 則是可以通過編譯的。編譯器會建立一個叫做匿名類帶有叫c的property。 例如下例:new{c,ContactName,c.Phone};ContactName和Phone都是在對映檔案中定義與表中欄位相對應的property。編譯器讀取資料並建立物件時,會建立一個匿名類,這個類有兩個屬性,為ContactName和Phone,然後根據資料初始化物件。另外編譯器還可以重新命名property的名字。
var q = from c in db.Customers select new {c.ContactName, c.Phone};
上面語句描述:使用 SELECT 和匿名型別返回僅含客戶聯絡人姓名和電話號碼的序列
var q = from e in db.Employees select new { Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone };
上面語句描述:使用SELECT和匿名型別返回僅含僱員姓名和電話號碼的序列,並將FirstName和LastName欄位合併為一個欄位“Name”,此外在所得的序列中將HomePhone欄位重新命名為Phone。
var q = from p in db.Products select new { p.ProductID, HalfPrice = p.UnitPrice / 2 };
上面語句描述:使用SELECT和匿名型別返回所有產品的ID以及HalfPrice(設定為產品單價除以2所得的值)的序列。
3.條件形式:
說明:生成SQL語句為:case when condition then else。
var q = from p in db.Products select new { p.ProductName, Availability = p.UnitsInStock - p.UnitsOnOrder < 0 ? "Out Of Stock" : "In Stock" };
上面語句描述:使用SELECT和條件語句返回產品名稱和產品供貨狀態的序列。
4.指定型別形式:
說明:該形式返回你自定義型別的物件集。
var q = from e in db.Employees select new Name { FirstName = e.FirstName, LastName = e.LastName };
上面語句描述:使用SELECT和已知型別返回僱員姓名的序列。
5.篩選形式:
說明:結合where使用,起到過濾作用。
var q = from c in db.Customers where c.City == "London" select c.ContactName;
上面語句描述:使用SELECT和WHERE返回僅含倫敦客戶聯絡人姓名的序列。
6.shaped形式(整形型別):
說明:其select操作使用了匿名物件,而這個匿名物件中,其屬性也是個匿名物件。
var q = from c in db.Customers select new { c.CustomerID, CompanyInfo = new {c.CompanyName, c.City, c.Country}, ContactInfo = new {c.ContactName, c.ContactTitle} };
語句描述:使用SELECT 和匿名型別返回有關客戶的資料的整形子集。查詢顧客的ID和公司資訊(公司名稱,城市,國家)以及聯絡資訊(聯絡人和職位)。
7.巢狀型別形式:
說明:返回的物件集中的每個物件DiscountedProducts屬性中,又包含一個集合。也就是每個物件也是一個集合類。
var q = from o in db.Orders select new { o.OrderID, DiscountedProducts = from od in o.OrderDetails where od.Discount > 0.0 select od, FreeShippingDiscount = o.Freight };
語句描述:使用巢狀查詢返回所有訂單及其OrderID 的序列、打折訂單中專案的子序列以及免送貨所省下的金額。
8.本地方法呼叫形式(LocalMethodCall):
這個例子在查詢中呼叫本地方法PhoneNumberConverter將電話號碼轉換為國際格式。
var q = from c in db.Customers where c.Country == "UK" || c.Country == "USA" select new { c.CustomerID, c.CompanyName, Phone = c.Phone, InternationalPhone = PhoneNumberConverter(c.Country, c.Phone) };
PhoneNumberConverter方法如下:
public string PhoneNumberConverter(string Country, string Phone) { Phone = Phone.Replace(" ", "").Replace(")", ")-"); switch (Country) { case "USA": return "1-" + Phone; case "UK": return "44-" + Phone; default: return Phone; } }
下面也是使用了這個方法將電話號碼轉換為國際格式並建立XDocument
XDocument doc = new XDocument( new XElement("Customers", from c in db.Customers where c.Country == "UK" || c.Country == "USA" select (new XElement("Customer", new XAttribute("CustomerID", c.CustomerID), new XAttribute("CompanyName", c.CompanyName), new XAttribute("InterationalPhone", PhoneNumberConverter(c.Country, c.Phone)) ))));
9.Distinct形式:
說明:篩選欄位中不相同的值。用於查詢不重複的結果集。生成SQL語句為:SELECT DISTINCT [City] FROM [Customers]
var q = ( from c in db.Customers select c.City ) .Distinct();
語句描述:查詢顧客覆蓋的國家。
LINQ to SQL語句(3)之Count/Sum/Min/Max/Avg
適用場景:統計資料吧,比如統計一些資料的個數,求和,最小值,最大值,平均數。
Count
說明:返回集合中的元素個數,返回INT型別;不延遲。生成SQL語句為:SELECT COUNT(*) FROM
1.簡單形式:
得到資料庫中客戶的數量:
var q = db.Customers.Count();
2.帶條件形式:
得到資料庫中未斷貨產品的數量:
var q = db.Products.Count(p => !p.Discontinued);
LongCount
說明:返回集合中的元素個數,返回LONG型別;不延遲。對於元素個數較多的集合可視情況可以選用LongCount來統計元素個數,它返回long型別,比較精確。生成SQL語句為:SELECT COUNT_BIG(*) FROM
var q = db.Customers.LongCount();
Sum
說明:返回集合中數值型別元素之和,集合應為INT型別集合;不延遲。生成SQL語句為:SELECT SUM(…) FROM
1.簡單形式:
得到所有訂單的總運費:
var q = db.Orders.Select(o => o.Freight).Sum();
2.對映形式:
得到所有產品的訂貨總數:
var q = db.Products.Sum(p => p.UnitsOnOrder);
Min
說明:返回集合中元素的最小值;不延遲。生成SQL語句為:SELECT MIN(…) FROM
1.簡單形式:
查詢任意產品的最低單價:
var q = db.Products.Select(p => p.UnitPrice).Min();
2.對映形式:
查詢任意訂單的最低運費:
var q = db.Orders.Min(o => o.Freight);
3.元素:
查詢每個類別中單價最低的產品:
var categories = from p in db.Products group p by p.CategoryID into g select new { CategoryID = g.Key, CheapestProducts = from p2 in g where p2.UnitPrice == g.Min(p3 => p3.UnitPrice) select p2 };
Max
說明:返回集合中元素的最大值;不延遲。生成SQL語句為:SELECT MAX(…) FROM
1.簡單形式:
查詢任意僱員的最近僱用日期:
var q = db.Employees.Select(e => e.HireDate).Max();
2.對映形式:
查詢任意產品的最大庫存量:
var q = db.Products.Max(p => p.UnitsInStock);
3.元素:
查詢每個類別中單價最高的產品:
var categories = from p in db.Products group p by p.CategoryID into g select new { g.Key, MostExpensiveProducts = from p2 in g where p2.UnitPrice == g.Max(p3 => p3.UnitPrice) select p2 };
Average
說明:返回集合中的數值型別元素的平均值。集合應為數字型別集合,其返回值型別為double;不延遲。生成SQL語句為:SELECT AVG(…) FROM
1.簡單形式:
得到所有訂單的平均運費:
var q = db.Orders.Select(o => o.Freight).Average();
2.對映形式:
得到所有產品的平均單價:
var q = db.Products.Average(p => p.UnitPrice);
3.元素:
查詢每個類別中單價高於該類別平均單價的產品:
var categories = from p in db.Products group p by p.CategoryID into g select new { g.Key, ExpensiveProducts = from p2 in g where p2.UnitPrice > g.Average(p3 => p3.UnitPrice) select p2 };
Aggregate
說明:根據輸入的表示式獲取聚合值;不延遲。即是說:用一個種子值與當前元素通過指定的函式來進行對比來遍歷集合中的元素,符合條件的元素保留下來。如果沒有指定種子值的話,種子值預設為集合的第一個元素。
LINQ to SQL語句(4)之Join
適用場景:在我們表關係中有一對一關係,一對多關係,多對多關係等。對各個表之間的關係,就用這些實現對多個表的操作。
說明:在Join操作中,分別為Join(Join查詢), SelectMany(Select一對多選擇)和GroupJoin(分組Join查詢)。 該擴充套件方法對兩個序列中鍵匹配的元素進行inner join操作
SelectMany
說明:我們在寫查詢語句時,如果被翻譯成SelectMany需要滿足2個條件。1:查詢語句中沒有join和into,2:必須出現EntitySet。在我們表關係中有一對一關係,一對多關係,多對多關係等,下面分別介紹一下。
1.一對多關係(1 to Many):
var q = from c in db.Customers from o in c.Orders where c.City == "London" select o;
語句描述:Customers與Orders是一對多關係。即Orders在Customers類中以EntitySet形式出現。所以第二個from是從c.Orders而不是db.Orders裡進行篩選。這個例子在From子句中使用外來鍵導航選擇倫敦客戶的所有訂單。
var q = from p in db.Products where p.Supplier.Country == "USA" && p.UnitsInStock == 0 select p;
語句描述:這一句使用了p.Supplier.Country條件,間接關聯了Supplier表。這個例子在Where子句中使用外來鍵導航篩選其供應商在美國且缺貨的產品。生成SQL語句為:
SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID],[t0].[QuantityPerUnit],[t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder],[t0].[ReorderLevel], [t0].[Discontinued] FROM [dbo].[Products] AS [t0] LEFT OUTER JOIN [dbo].[Suppliers] AS [t1] ON [t1].[SupplierID] = [t0].[SupplierID] WHERE ([t1].[Country] = @p0) AND ([t0].[UnitsInStock] = @p1) -- @p0: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [USA] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [0]
2.多對多關係(Many to Many):
var q = from e in db.Employees from et in e.EmployeeTerritories where e.City == "Seattle" select new { e.FirstName, e.LastName, et.Territory.TerritoryDescription };
說明:多對多關係一般會涉及三個表(如果有一個表是自關聯的,那有可能只有2個表)。這一句語句涉及Employees, EmployeeTerritories, Territories三個表。它們的關係是1:M:1。Employees和Territories沒有很明確的關係。
語句描述:這個例子在From子句中使用外來鍵導航篩選在西雅圖的僱員,同時列出其所在地區。這條生成SQL語句為:
SELECT [t0].[FirstName], [t0].[LastName], [t2].[TerritoryDescription] FROM [dbo].[Employees] AS [t0] CROSS JOIN [dbo].[EmployeeTerritories] AS [t1] INNER JOIN [dbo].[Territories] AS [t2] ON [t2].[TerritoryID] = [t1].[TerritoryID] WHERE ([t0].[City] = @p0) AND ([t1].[EmployeeID] = [t0].[EmployeeID]) -- @p0: Input NVarChar (Size = 7; Prec = 0; Scale = 0) [Seattle]
3.自聯接關係:
var q = from e1 in db.Employees from e2 in e1.Employees where e1.City == e2.City select new { FirstName1 = e1.FirstName, LastName1 = e1.LastName, FirstName2 = e2.FirstName, LastName2 = e2.LastName, e1.City };
語句描述:這個例子在select 子句中使用外來鍵導航篩選成對的僱員,每對中一個僱員隸屬於另一個僱員,且兩個僱員都來自相同城市。生成SQL語句為:
SELECT [t0].[FirstName] AS [FirstName1], [t0].[LastName] AS [LastName1],[t1].[FirstName] AS [FirstName2], [t1].[LastName] AS [LastName2],[t0].[City] FROM [dbo].[Employees] AS [t0], [dbo].[Employees] AS [t1] WHERE ([t0].[City] = [t1].[City]) AND ([t1].[ReportsTo] = [t0].[EmployeeID])
GroupJoin
像上面所說的,沒有join和into,被翻譯成SelectMany,同時有join和into時,那麼就被翻譯為GroupJoin。在這裡into的概念是對其結果進行重新命名。
1.雙向聯接(Two way join):
此示例顯式聯接兩個表並從這兩個表投影出結果:
var q = from c in db.Customers join o in db.Orders on c.CustomerID equals o.CustomerID into orders select new { c.ContactName, OrderCount = orders.Count() };
說明:在一對多關係中,左邊是1,它每條記錄為c(from c in db.Customers),右邊是Many,其每條記錄叫做o ( join o in db.Orders ),每對應左邊的一個c,就會有一組o,那這一組o,就叫做orders,也就是說,我們把一組o命名為orders,這就是into用途。這也就是為什麼在select語句中,orders可以呼叫聚合函式Count。在T-SQL中,使用其內嵌的T-SQL返回值作為欄位值。如圖所示:
生成SQL語句為:
SELECT [t0].[ContactName], ( SELECT COUNT(*) FROM [dbo].[Orders] AS [t1] WHERE [t0].[CustomerID] = [t1].[CustomerID] ) AS [OrderCount] FROM [dbo].[Customers] AS [t0]
2.三向聯接(There way join):
此示例顯式聯接三個表並分別從每個表投影出結果:
var q = from c in db.Customers join o in db.Orders on c.CustomerID equals o.CustomerID into ords join e in db.Employees on c.City equals e.City into emps select new { c.ContactName, ords = ords.Count(), emps = emps.Count() };
生成SQL語句為:
SELECT [t0].[ContactName], ( SELECT COUNT(*) FROM [dbo].[Orders] AS [t1] WHERE [t0].[CustomerID] = [t1].[CustomerID] ) AS [ords], ( SELECT COUNT(*) FROM [dbo].[Employees] AS [t2] WHERE [t0].[City] = [t2].[City] ) AS [emps] FROM [dbo].[Customers] AS [t0]
3.左外部聯接(Left Outer Join):
此示例說明如何通過使用 此示例說明如何通過使用DefaultIfEmpty() 獲取左外部聯接。在僱員沒有訂單時,DefaultIfEmpty()方法返回null:
var q = from e in db.Employees join o in db.Orders on e equals o.Employee into ords from o in ords.DefaultIfEmpty() select new { e.FirstName, e.LastName, Order = o };
相關推薦
年終鉅獻 史上最全 ——LINQ to SQL語句
LINQ to SQL語句(1)之Where 適用場景:實現過濾,查詢等功能。 說明:與SQL命令中的Where作用相似,都是起到範圍限定也就是過濾作用的,而判斷條件就是它後面所接的子句。Where操作包括3種形式,分別為簡單形式、關係條件形式、First()形式。下面分別用例項舉例下: 1.簡單形式: 例如
史上最全 ——LINQ to SQL語句
轉自:http://www.cnblogs.com/jara/p/3473996.html 史上最全 ——LINQ to SQL語句 LINQ to SQL語句(1)之Where 適用場景:實現過濾,查詢等功能。 說明:與SQL命令中的Where作用相似,都是起到範圍限定也就是過濾作
【轉載】史上最全:TensorFlow 好玩的技術、應用和你不知道的黑科技
tube map 高性能 知識 seq 出現 執行時間 mes lex 【導讀】TensorFlow 在 2015 年年底一出現就受到了極大的關註,經過一年多的發展,已經成為了在機器學習、深度學習項目中最受歡迎的框架之一。自發布以來,TensorFlow 不斷在完善並增加新
史上最全: svn與git的對照(二):svn與git的相關概念
fill 來看 out avi head clas 相關 iss b2c 如圖1是svnserver端數據的文件夾結構 以下是gitserver端的文件夾結構 縱觀svn和git服務端的文件夾結構我們非常easy發現 1.有些目錄還是蠻像的。甚
React Native常用第三方組件匯總--史上最全 之一
提示 存儲 ext upload body ner board pup wan 把我認為最好的知識,拿來與他人分享,是這一生快事之一! React Native 項目常用第三方組件匯總: react-native-animatable 動畫 react-na
掛載文件系統出現"kernel panic..." 史上最全解決方案
某個文件 table sha mount nic mic 2.6 完成 又是 問:掛載自己制作的文件系統卡在這裏: NET: Registered protocol family 1 NET: Registered protocol family 17
史上最全的Ajax
tool 復制 last 毫秒 如何實現 mon adding ast turn 本章內容: 簡介 偽 AJAX 原生 AJAX XmlHttpRequest 的屬性、方法、跨瀏覽器支持 jQuery AJAX 常用方法 跨域 AJAX JsonP
oracle表空間查詢維護命令大全之中的一個(數據表空間)史上最全
ava 劃分 man max rac 帳戶 oca nio msi 表空間是數據庫的邏輯劃分,一個表空間僅僅能屬於一個數據庫。全部的數據庫對象都存放在建立指定的表空間中。但主要存放的是表, 所以稱作表空間。在oracle 數據庫中至少存在
史上最全的變量、作用域和內存問題
分配 data () pen ole 創建 最全 操作符 釋放內存 (一)JavaScript變量能夠用來保存兩種類型的值:基本類型值和引用類型值。基本類型的值源自下面5種基本數據類型:Undefined、Null、Boolean、Number和 Str
史上最全Html和CSS布局技巧
喜歡 輸出 隔離 init scale ext med 兩種 float 單列布局水平居中 水平居中的頁面布局中最為常見的一種布局形式,多出現於標題,以及內容區域的組織形式,下面介紹四種實現水平居中的方法(註:下面各個實例中實現的是child元素的對齊操作,child元素的
轉: 作者 李艷鵬: 史上最全的架構師圖譜
-s -a ddd java se http 聯網 hadoop -c clas 本文是筆者多年來積累和收集的知識技能圖譜,有的是筆者原創總結的最佳實踐,有的是小夥伴們的分享,其中每個秘籍圖譜裏面的內容都是互聯網高並發架構師應該了解和掌握的知識,筆者索性把這些圖譜收集在
程序員進階路上不能錯過的史上最全技術知識圖譜秘籍
容器 互聯網 def 1.3 java架構師 方法 分享 開發技能 2.4 今天在技術大海中遊啊遊遊啊遊,哇啊哈哈 ^_^發現了一份非常有用的超級技術圖譜誒! 強烈推薦啊!!本文原作者是易寶支付技術經理/架構師李艷鵬,這是鵬哥多年來積累和收集的技術知識技能圖譜,有的是鵬哥原
史上最全最正確的zabbix server安裝過程
zabbix安裝 zabbix server 說在前面的話:本例使用的是centos7、zabbix2.2.6版本,其他版本需要再驗證不要使用yum安裝tomcat和jdk,否則安裝zabbix會報錯正文:一、Lamp安裝及準備工作yum -y install httpd mysql mysql-se
史上最全的JAVA面試總結
java數據庫類作為後端開發,可以說數據庫是重之又重。提問的比例也相當之大。所以這裏先記錄下這個。如何快速導入10萬條數據到MySQL數據庫?這個應該當時很緊張,居然半天說不出來。其實當時心裏有一個答案了,就是存儲過程。但是因為平常開發基本上沒用到過這東西,所以都不敢說了。。網上還有有一些答案說批處理,通過s
史上最全最強SpringMVC詳細示例實戰教程
tin turn 方法 流程圖 瀏覽器 學習 this b- converter SpringMVC學習筆記---- 一、SpringMVC基礎入門,創建一個HelloWorld程序 1.首先,導入SpringMVC需要的jar包。 2.添加Web.xm
史上最全設計模式導學目錄(完整版)
最全 content bsp 書籍 轉載 http 模式 ogr book 該文章是轉載大牛的分享。備忘學習。 http://blog.csdn.net/lovelion/article/details/17517213 GitHu上分享的一些資料 https://zh
史上最全Linux提權後獲取敏感信息方法
ron tables 快速 結果 my.conf faillog suid rmi rem http://www.freebuf.com/articles/system/23993.html 在本文開始之前,我想指出我不是專家。據我所知,在這個龐大的區域,沒有一個“神奇”
IT架構師絕對不能錯過的34張史上最全技術知識圖譜
技能圖譜架構師圖譜Java架構師圖譜微服務架構秘籍 一致性圖譜互聯網大流量的方法安全秘籍阿裏巴巴常用小框架架構方法論圖譜設計模式秘籍圖譜 JVM虛擬機垃圾回收圖譜Java並發圖譜Java集合圖譜Java集合類圖Java List類圖Java Map類圖Java Set類圖Java TCP IPHadoop技能
Vue2.0史上最全入坑教程(下)—— 實戰案例
多少 跳轉 border src fff end har second vue 前言:經過前兩節的學習,我們已經可以創建一個vue工程了。下面我們將一起來學習制作一個簡單的實戰案例。 說明:默認我們已經用vue-cli(vue腳手架或稱前端自動化構建工具)創建好項目了 一
史上最全華為路由器交換機配置命令大合集
uid info rtt duplex display telnet facet sna its 華為路由器交換機配置命令是大家使用時經常遇到的,顧名思義關於交換機的計算機命令,路由器命令,交換機命令和動靜態命令都將在文中提到。 【限時免費】年底最強一次雲計算大會,看傳