現在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.
相關文章