2011-10-20 50 views
1

我想用CAML建立一個查詢,它似乎工作得很好,但我有一個問題,我想讓Caml找到值,即使它有重音的話或沒有。例如,現在如果我搜索「Carlos」,caml會給我包含「carlos」或「CARLOS」或「CaRlOs」或大小寫的任意組合的列表項。現在我希望它也能讓我得到那些帶有重音字母的字母,例如它應該返回tu「Cárlos」或「carlös」或「càrlos」...¿是否有選項?Sharepoint查詢與CAML和口音

我使用的CAML查詢是非常簡單,它看起來在SharePoint列表...

卡洛斯

感謝您的意見!

回答

1

CAML引擎接受這種可疑的「查詢語言」,將暴露的名稱/值從架構轉換爲後端格式,構建適當的SQL查詢,然後將整個混亂髮送到SQL Server。排序 - 包括不敏感 - 規則是SQL Server的一部分,而不是SharePoint(或CAML引擎)本身(,儘管可能存在微妙的錯誤;您已被警告!)。

SQL Server支持不同的COLLATIONS(包括一些不區分重音以及「標準」不區分大小寫)。 但是,SharePoint在相當有限的「受支持」配置中運行 - 更改排序規則可能不合適。

所有的SharePoint Server所需的數據庫使用Latin1_General_CI_AS_KS_WS排序規則。

但是,它可以能夠破解適當的SQL表背襯列表與ALTER TABLE並指定一個替代歸類如SQL_Latin1_General_Cp1_CI_AI(AI =不區分重音,AS =區分重音)。 您的里程可能會有所不同:這不是受支持的方案。

另一個選擇可能是使用一個項目觸發器和代碼隱藏來「歸一化」所有的值 - 比如說「carlos」。 (這些規範化的值將存儲在不同的列中。)代碼隱藏可以使用.NET的全部功能來執行此步驟,但也會引入其他複雜性/要求。

快樂編碼。

+0

MMM看起來這是唯一的選擇。我會嘗試正常化選項。謝謝你的提示 – carlos

1

PST你給我的提示完美,簡單,快捷......這是我用來規範化字符串的代碼。再次

public static string Normalizarstring(this string cadena) 
     { 
      StringBuilder sb = new StringBuilder(); 

      cadena.Normalize(NormalizationForm.FormD).ToCharArray().ToList() 
       .ForEach(caracter => sb.Append((CharUnicodeInfo.GetUnicodeCategory(caracter) != UnicodeCategory.NonSpacingMark) ? caracter.ToString() : "")); 

      return (sb.ToString().Normalize(NormalizationForm.FormC)); 
     } 

謝謝!