在LINQ中使用LIKE
- 2009-04-17
- 44767
- 0
現在demo操作資料庫都已經改用LINQ了,以往在T-SQL語句中有LIKE可以使用,但是LINQ沒有直接的支援LIKE,所以demo都是使用Contains、StartsWith、EndsWith來替代LIKE的功能,其實有一個SqlMethods類別可以幫助我們達到目標的。
廢話不多說,直接來比較吧
當我們利用以下語法來查詢
(from p in db.物件資訊 where p.User2.Contains("北") select p)會被編譯器解析為
WHERE [t0].[User2] LIKE @p0',N'@p0 nvarchar(3)',@p0=N'%北%'
或許我們會很直接的想說那我想使用%這符號是否可以直接下呢?
(from p in db.物件資訊 where p.User2.Contains("北%") select p);
傳出去的SQL變為
WHERE [t0].[User2] LIKE @p0 ESCAPE ''~''',N'@p0 nvarchar(5)',@p0=N'%北~%%'
所以很明確的並不能這樣子使用,我們想要使用%來查詢字串的話就要引用一下SqlMethods類別那我們就可以使用LIKE囉
(from p in db.物件資訊 where SqlMethods.Like(p.User2,"%北") select p);
傳出去的SQL變為
WHERE [t0].[User2] LIKE @p0',N'@p0 nvarchar(2)',@p0=N'%北'
很明顯的我們就可以直接使用%了,但是因為我們已經啟用了SqlMethods所以其實不只%,常用的底線等替代字元也都可以用了因為他就已經是SQL的語法啦。
只有Linq To Sql 才可以這樣用
如果你有興趣還可以直接來擴充LINQ寫法如下
public static IQueryable<T> Like<T>(this IQueryable<T> source, string propertyName, string keyword) { var type = typeof(T); var property = type.GetProperty(propertyName); var parameter = Expression.Parameter(type, "p"); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var constant = Expression.Constant("%" + keyword + "%"); MethodCallExpression methodExp = Expression.Call(null, typeof(SqlMethods).GetMethod("Like", new Type[] { typeof(string), typeof(string) }), propertyAccess, constant); Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(methodExp, parameter); return source.Where(lambda); }
http://msdn.microsoft.com/zh-tw/library/system.data.linq.sqlclient.sqlmethods.aspx
回應討論