人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

LINQ to SQL:處理char(1)字段的方式會引起全表掃描問題

發(fā)布日期:2022-02-03 12:50 | 文章來源:站長之家

image

如果表中的字段類型為 char(1) 時,Linq to SQL生成char (System.Char)的屬性,如下圖

image image
表定義 生成的實(shí)體

2.

如果要查詢LineCode=='A'的記錄,可以這樣定義Linq查詢語句

var test1 = from p in db.ProductLines
where p.LineCode =='A'
select p;

生成的SQL語句是這樣的

SELECT [t0].[LineCode], [t0].[LineName], [t0].[JPH], [t0].[QueueCount]
FROM [dbo].[ProductLine] AS [t0]
WHERE UNICODE([t0].[LineCode]) = @p0
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [65]
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.21022.8

注意到Where語句了嗎?是WHERE UNICODE([t0].[LineCode]) = 65,這里先取LineCode列內(nèi)容的UNICODE再和'A'的UNICODE比較。我們知道'A'和'a'的UNICODE是不同的。UNICODE('A') =65,UNICODE('a')=97,也就是說,我們在Linq to SQL中這二個查詢的結(jié)果是不一樣的。

Linq 語句
var test1 = from p in db.ProductLines
where p.LineCode =='a'
select p;
var test1 = from p in db.ProductLines
where p.LineCode =='A'
select p;
生成SQL語句
SELECT [t0].[LineCode], [t0].[LineName], [t0].[JPH], [t0].[QueueCount]
FROM [dbo].[ProductLine] AS [t0]
WHERE UNICODE([t0].[LineCode]) = @p0
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [97]
SELECT [t0].[LineCode], [t0].[LineName], [t0].[JPH], [t0].[QueueCount]
FROM [dbo].[ProductLine] AS [t0]
WHERE UNICODE([t0].[LineCode]) = @p0
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [65]

明顯,在Linq to sql是查詢char(1)類型字段是區(qū)分大小寫的。

這還會導(dǎo)致一個比較嚴(yán)重的問題,我們知道在SQL Server中,任何在運(yùn)算符左邊的操作都會使SQL采用全表掃描。也就是說,Linq的這個查詢,會引起全表掃描,即使[LineCode]列上定義了聚合索引。而如果是where [linecode]='A',則可以使用索引。我們看下這二種情況時的查詢執(zhí)行計(jì)劃對比。

image

圖中可以看出,Linq to SQL 生成的SQL語句是表掃描,而后者則是索引查找。

3.

對策

在DBML設(shè)計(jì)器中將LineCode改成string類型。

image

看一下改了之后的查詢

var test1 = from p in db.ProductLines
where p.LineCode == "a"
select p;
SELECT [t0].[LineCode], [t0].[LineName], [t0].[JPH], [t0].[QueueCount]
FROM [dbo].[ProductLine] AS [t0]
WHERE [t0].[LineCode] = @p0
-- @p0: Input VarChar (Size = 1; Prec = 0; Scale = 0) [a]
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.21022.8
Linq sql

改為string后,生成的SQL不再用UNICODE函數(shù)了,就解決了區(qū)分大小寫和引起全表掃描的問題。但又引起一個新的問題,因?yàn)閿?shù)據(jù)庫中存儲的數(shù)據(jù)長度是1,在Insert和Update時就要注意,LineCode不要輸入過長的內(nèi)容,否則會出錯了。

香港服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實(shí)時開通

自選配置、實(shí)時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部