[轉貼] 在LINQ中使用LIKE

2012031216:18

現在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.