2013年9月3日 星期二

[轉貼] 在LINQ中使用LIKE

出處:http://demo.tc/Post/512

現在demo操作資料庫都已經改用LINQ了,以往在T-SQL語句中有LIKE可以使用,但是LINQ沒有直接的支援LIKE,所以demo都是使用Contains、StartsWith、EndsWith來替代LIKE的功能,其實有一個SqlMethods類別可以幫助我們達到目標的。
    廢話不多說,直接來比較吧
    當我們利用以下語法來查詢
    1. (from p in db.物件資訊 where p.User2.Contains("北") select p)
    會被編譯器解析為
    1. WHERE [t0].[User2] LIKE @p0',N'@p0 nvarchar(3)',@p0=N'%北%'
    或許我們會很直接的想說那我想使用%這符號是否可以直接下呢?
    1. (from p in db.物件資訊 where p.User2.Contains("北%") select p);
    傳出去的SQL變為
    1. WHERE [t0].[User2] LIKE @p0 ESCAPE ''~''',N'@p0 nvarchar(5)',@p0=N'%~%%'
    所以很明確的並不能這樣子使用,我們想要使用%來查詢字串的話就要引用一下SqlMethods類別那我們就可以使用LIKE囉
    1. (from p in db.物件資訊 where SqlMethods.Like(p.User2,"%北") select p);
    傳出去的SQL變為
    1. WHERE [t0].[User2] LIKE @p0',N'@p0 nvarchar(2)',@p0=N'%'
    很明顯的我們就可以直接使用%了,但是因為我們已經啟用了SqlMethods所以其實不只%,常用的底線等替代字元也都可以用了因為他就已經是SQL的語法啦。
    只有Linq To Sql 才可以這樣用

    如果你有興趣還可以直接來擴充LINQ寫法如下
    1. public static IQueryable<T> Like<T>(this IQueryable<T> source, string propertyName, string keyword)
    2. {
    3. var type = typeof(T);
    4. var property = type.GetProperty(propertyName);
    5.         var parameter = Expression.Parameter(type, "p");
    6.         var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    7.         var constant = Expression.Constant("%" + keyword + "%");
    8.         MethodCallExpression methodExp = Expression.Call(null, typeof(SqlMethods).GetMethod("Like", new Type[] { typeof(string), typeof(string) }), propertyAccess, constant);
    9.         Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(methodExp, parameter);
    10.         return source.Where(lambda);
    11.     }

    沒有留言:

    張貼留言