2011-10-20 48 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)); 
     } 

谢谢!