【问题标题】:UserId string comparison within ASP.NET IdentityASP.NET Identity 中的 UserId 字符串比较
【发布时间】:2015-11-04 15:04:29
【问题描述】:

我在 MVC 5 中使用 ASP.NET 标识,并想知道在查询期间执行字符串比较的最佳方法,查询已使用 userId 作为外键输入记录的表。

通常我会选择==,但我不确定.NET 身份中的userId 字符串是如何创建的。 我想它实际上是某种 GUID,所以我认为 == 会很好,但我想知道文化或案例是否会涉及到它。

有谁知道该字符串是否是 == 类型比较的唯一 GUID,还是我应该使用 string.Equals 和一些 StringComparison 选项来考虑文化?

【问题讨论】:

  • Identity默认使用字符串作为用户ID,你改了吗?
  • 我没有改变任何东西,它是我指定的字符串

标签: asp.net asp.net-mvc-5 asp.net-identity


【解决方案1】:

ASP.NET Identity 可以使用 GUID 作为键。在这种情况下,GUID 不应包含任何特定于文化的字符。所以StringComparision. InvariantCultureIgnoreCase 应该在 C# 中使用 string.EqualsToLower (ToUpper) 可用于 SQL 查询 (LINQ)。

【讨论】:

  • 它可以使用 GUID,但我的和默认的一样,只是一个字符串。
  • 默认情况下它应该被存储为字符串的GUID(不是System.Guid结构)。查看this code。是Id = Guid.NewGuid().ToString()
  • 是的,这就是我得到的 GUID,所以它不应该是特定于文化的,对吧?但是在 ToString() 调用期间,它会受到服务器文化的影响,从而导致我出现问题,或者计划“==”会减少芥末吗?
  • 不确定我是否理解这种恐惧。 Guid 显示为十六进制数字。不确定我是否理解恐惧:没有文化特定的字符,我重复一遍。 == 方式,即String.Equals 区分大小写。于是提出了上述解决方案。
  • 我想我想知道是否通过忽略大小写,我可能会得到一个重复(如果它是描述的 GUID 和字母字符 HEX,那么就像你说的那样没问题)。或者,如果说我假设大小写无关紧要,如果我从 db 中以大写形式回忆一个值,但在某些条件下,.NET 代码(如 x64 与 x86)决定翻转为小写当我期望它时,敏感比较将不匹配。
【解决方案2】:

您可能希望在此处使用 Ordinal/OrdinalIgnoreCase StringComparisons,因为它会逐个字符地比较字符串,而不考虑语言约定。

在此处阅读更多信息:https://msdn.microsoft.com/en-us/library/cc165449.aspx

在这里:https://msdn.microsoft.com/en-us/library/system.stringcomparison(v=vs.110).aspx

代码示例:

string1.Equals(string2, StringComparison.Ordinal);
string1.Equals(string2, StringComparison.OrdinalIgnoreCase);

【讨论】:

    猜你喜欢
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    相关资源
    最近更新 更多