2015-11-04 94 views
4

我實現了擴展方法標準化在這個帖子中描述的字符串:LINQ Where Ignore Accentuation and Case使用C#擴展方法在LINQ查詢謂詞

這種方法的工作一樣,如果我做這樣的事情魅力:

employee.AsQueryable().Where(t=>t.Text.ToLower().RemoveDiacritics().Contains("ced")); 

現在,我想通過動態地生成where子句的謂詞來更一般地使用它。

var values = filters.Select(f => f.Value is string && f.IgnoreAccent 
           ?((string)f.Value).RemoveDiacritics() 
           :f.Value).ToArray(); 

// Create a predicate expression 
string predicate = filter.ToExpression(filters); 

// Use the Where method of Dynamic Linq to filter the data 
queryable = queryable.Where(predicate, values); 

謂詞看起來就像這樣:

(Text.ToLower().RemoveDiacritics().Contains(@0)) 

對於一個未知的原因,在執行時,我得到了以下錯誤消息:

沒有適用的方法「RemoveDiacritics」存在型'String'

但是,這種方法實際上工作正常我在別處使用它。

任何想法這裏有什麼錯?

請注意,在這種情況下,ToLower()就像一個魅力。

在此先感謝您的幫助!

EDIT

這裏是擴展方法的定義:

public static class StringExtension 
{ 
    public static string RemoveDiacritics(this String s) 
    { 
     String normalizedString = s.Normalize(NormalizationForm.FormD); 
     StringBuilder stringBuilder = new StringBuilder(); 

     for (int i = 0; i < normalizedString.Length; i++) 
     { 
      Char c = normalizedString[i]; 

      if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
       stringBuilder.Append(c); 
     } 

     return stringBuilder.ToString(); 
    } 
} 
+0

您是否在依賴該方法的文件中包含了方法擴展的名稱空間? –

+0

另外,你使用命名空間別名? –

+0

在第一種情況下,您仍然有一個對象t,而在第二種情況下,您將f賦給一個字符串。 – jdweng

回答

2

動態LINQ的不支持擴展方法。 原因是動態Linq使用反射,並且很難找到擴展方法的實現,並使用反射來調用它。所以動態Linq的作者並沒有打擾它。

所以,你必須調用擴展方法像一個普通的靜態方法:

var values = filters.Select(f => f.Value is string && f.IgnoreAccent 
          ?StringExtensions.RemoveDiacritics((string)f.Value) 
          :f.Value).ToArray(); 
0
employee.AsQueryable().Where(t=>t.Text.ToLower().RemoveDiacritics().Contains("ced")); 

可以

employee.AsQueryable().Where(t=>t.Text.Equals("ced", StringComparison.OrdinalIgnoreCase)); 

這是更快,並且不與理會的情況下被替換。