加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 什么.NET StringComparer是等效的SQL的Latin1_General_CI_

发布时间:2020-12-15 18:12:31 所属栏目:百科 来源:网络整理
导读:我正在我的数据库和C#代码之间实现缓存层.这个想法是根据查询的参数来缓存某些DB查询的结果.数据库正在使用默认的排序规则 – SQL_Latin1_General_CP1_CI_AS或Latin1_General_CI_AS,我相信基于一些简短的搜索是相当于等同的,只是排序不同. 我需要一个.NET St
我正在我的数据库和C#代码之间实现缓存层.这个想法是根据查询的参数来缓存某些DB查询的结果.数据库正在使用默认的排序规则 – SQL_Latin1_General_CP1_CI_AS或Latin1_General_CI_AS,我相信基于一些简短的搜索是相当于等同的,只是排序不同.

我需要一个.NET StringComparer,可以给我相同的行为,至少对于等式测试和哈希码生成,正如数据库的归类正在使用的那样.目标是能够使用C#代码中的.NET字典中的StringComparer来确定特定的字符串键是否已经在缓存中.

一个真正简化的例子:

var comparer = StringComparer.??? // What goes here?

private static Dictionary<string,MyObject> cache =
    new Dictionary<string,MyObject>(comparer);

public static MyObject GetObject(string key) {
    if (cache.ContainsKey(key)) {
        return cache[key].Clone();
    } else {
        // invoke SQL "select * from mytable where mykey = @mykey"
        // with parameter @mykey set to key
        MyObject result = // object constructed from the sql result
        cache[key] = result;
        return result.Clone();
    }
}
public static void SaveObject(string key,MyObject obj) {
    // invoke SQL "update mytable set ... where mykey = @mykey" etc
    cache[key] = obj.Clone();
}

StringComparer与数据库排序规则相匹配的重要原因在于这两个假阳性和假阴性都会对代码产生不良影响.

如果StringComparer说当数据库认为它们不同时,两个键A和B相等,那么数据库中可能有两行是这两个键,但缓存将阻止第二个键被要求返回A和B连续 – 因为获取B将不正确地命中缓存并返回检索到的对象A.

如果StringComparer说当数据库相信它们相同时,A和B不同,那么问题就更微妙了,但是也不会有问题.对于这两个键的GetObject调用将会很好,并返回对应于同一数据库行的对象.但是用键A调用SaveObject会使缓存不正确;仍然有一个具有旧数据的密钥B的缓存条目.随后的GetObject(B)将给出过时的信息.

所以为了使我的代码正常工作,我需要StringComparer来匹配数据库行为以进行相等性测试和哈希码生成.到目前为止,我的谷歌搜索已经产生了很多关于SQL排序和.NET比较不完全相同的事实的信息,但是没有关于差异的细节,无论它们是仅限于排序中的差异,还是可以找到一个StringComparer,如果不需要通用解决方案,则相当于特定的SQL排序规则.

(旁注 – 缓存层是通用目的,所以我不能对密钥的性质和归类是合适的做出特定的假设.我的数据库中的所有表共享相同的默认服务器排序规则,我只需要匹配整理存在)

解决方法

看看 CollationInfo课.它位于一个名为Microsoft.SqlServer.Management.SqlParser.dll的程序集中,尽管我不完全知道从哪里得到这个.有一个静态列表 Collations(名称)和静态方法 GetCollationInfo(按名称).

每个Collat??ionInfo都有一个Comparer.它与StringComparer不完全相同,但功能类似.

编辑:Microsoft.SqlServer.Management.SqlParser.dll是共享管理对象(SMO)包的一部分.此功能可以在这里下载到SQL Server 2008 R2:

http://www.microsoft.com/download/en/details.aspx?id=16978#SMO

编辑:Collat??ionInfo确实有一个名为EqualityComparer的属性,它是一个IEqualityComparer< string&gt ;.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读