我實現了擴展方法標準化在這個帖子中描述的字符串: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();
}
}
您是否在依賴該方法的文件中包含了方法擴展的名稱空間? –
另外,你使用命名空間別名? –
在第一種情況下,您仍然有一個對象t,而在第二種情況下,您將f賦給一個字符串。 – jdweng