demoshop

demo, trying to be the best_

在LINQ中使用LIKE

  • 2009-04-17
  • 44601
  • 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

回應討論