天天看點

Linq Like

Like的操作,有點像in,但是,方向變了。什麼意思呢。就是你給定一個字元串,去尋找資料中某個字段包含這個字元串。就是給定的字元串是某字段的子集。Sql Script是這麼寫的。

Selec * from table where id like '%AD%'

Selec * from table where id like '%AD'

Selec * from table where id like 'AD%'

上面的%是通配符,表示,該字段含有某個值,不知道的位置使用%代替。第一個是表示中間一段是AD,兩頭不清楚。第二個是結尾是AD,前面的不清楚。第三個相反,開頭是AD,結尾不清楚。其對應的Linq 語句為

var q = (from c in db.Customers

where c.CustomerID.Contains("ROUT")

select c).ToList();

其生成的sql為

SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactT

itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Coun

try], [t0].[Phone], [t0].[Fax]

FROM [dbo].[Customers] AS [t0]

WHERE [t0].[CustomerID] LIKE @p0

-- @p0: Input String (Size = 6; Prec = 0; Scale = 0) [%ROUT%]

以ISSA結尾,頭部通配:

where c.CustomerID.EndsWith("ISSA")

-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [%ISSA]

以ARO開始,尾部通配:

where c.CustomerID.StartsWith("ARO")

-- @p0: Input String (Size = 4; Prec = 0; Scale = 0) [ARO%]

Linq 還提供了一種方法,叫做SqlMethods.Like,需要先添加System.Data.Linq.SqlClient名稱空間。上面的三個可以寫成

where SqlMethods.Like(c.CustomerID, "%ROUT%")

這裡,你需要自己填寫通配符,告訴Linq你是如何比對。比如

where SqlMethods.Like(c.CustomerID, "%ISSA")

再比如:

where SqlMethods.Like(c.CustomerID, "ARO%")

SqlMethods.Like最奇妙的地方,莫過于,自己定義的通配表達式,你可以在任何地方實作通配。比如

where SqlMethods.Like(c.CustomerID, "A%O%T")

-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [A%O%T]

就是最标準的知道以A開頭,以T結尾,中間知道一個值O,其他就什麼不知道了。就用這個。

SQL Server 定義了四種通配符,在這裡都可以使用。它們是:

Wildcard character Description Example 

% Any string of zero or more characters. WHERE title LIKE '%computer%' finds all book titles with the word 'computer' anywhere in the book title. 

_ (underscore) Any single character. WHERE au_fname LIKE '_ean' finds all four-letter first names that end with ean (Dean, Sean, and so on). 

[ ] Any single character within the specified range ([a-f]) or set ([abcdef]). WHERE au_lname LIKE '[C-P]arsen' finds author last names ending with arsen and beginning with any single character between C and P, for example Carsen, Larsen, Karsen, and so on. 

[^] Any single character not within the specified range ([^a-f]) or set ([^abcdef]). WHERE au_lname LIKE 'de[^l]%' all author last names beginning with de and where the following letter is not l.

%表示零長度或任意長度的字元串。_表示一個字元。[]表示在某範圍區間的一個字元。[^]表示不在某範圍區間的一個字元

比如:

where SqlMethods.Like(c.CustomerID, "A_O_T")

就用_代表一個字元。其生成sql為

-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [A_O_T]

對于Not Like,也很簡單,加個取非就是。

where !SqlMethods.Like(c.CustomerID, "A_O_T")

SqlMethods.Like還有一個參數,叫escape Character,其将會被翻譯成類似下面的語句。

SELECT columns FROM table WHERE 

column LIKE '%\%%' ESCAPE '\'

escape 是因為某字段中含有特殊字元,比如%,_ [ ]這些被用作通配符的。這時就要用到Escape了。這是sql server的事情了。