【问题标题】:How to compare two GUIDs in Linq to Entities如何将 Linq 中的两个 GUID 与实体进行比较
【发布时间】:2013-01-02 04:54:45
【问题描述】:

我正在编写一个 L2E 查询来比较两个 GUID 值。它根本不允许直接比较,并且 L2E 查询也不允许使用 .ToString() 方法。我们如何实现这一点?

【问题讨论】:

  • 尝试this结合L2E和L2O
  • 我认为在该示例中这样做对我不起作用。我的查询是在 where 条件下比较 GUID。
  • 你需要得到等价的字符串表示(格式相同),然后进行字符串比较。对于 EF 中的 GUID 字符串,示例将有所帮助。对于程序中的 GUID 字符串,您可以使用 .ToString 或者您可能需要一些更改(取决于内部 guid 格式差异)

标签: linq-to-entities guid


【解决方案1】:

我不知道这是否适用于你的情况,但我发现我可以在 Linq 中使用 Guid.CompareTo 方法,它可以正确地将其转换为 SQL。

documentQuery.Where(s => s.DocumentGuid.CompareTo(MyGuidVariable) > 0);

这会产生以下 SQL:

AND ([Extent1].[DocumentGuid] > @p__linq__1)

【讨论】:

  • 感谢您在这里度过了美好的一天。经过数小时令人沮丧的调试后,我终于可以让我的查询工作了。先生,你应该得到一块饼干。
  • 这是我在互联网上唯一能找到这个正确答案的地方。
  • 为什么使用 > 0 而不是 == 0? > 给了我错误的结果,并且 == 预期的结果...... @Eric
  • msdn.microsoft.com/en-us/library/… 根据msdn文档,当两个Guid相等时返回0
  • 很遗憾,我没有使用 Azure SQL Server 12.0 获得正确的 SQL:WHERE (CASE WHEN [a].[Id] = @__greatestProcessedId_0 THEN 0 WHEN [a].[Id] > @__greatestProcessedId_0 THEN 1 WHEN [a].[Id] < @__greatestProcessedId_0 THEN -1 END > 0)
【解决方案2】:

您需要比较两个 GUID 参数的字符串表示

string var1=Convert.ToString(GuidParam1);
string var2=Convert.ToString(GuidParam2)

然后比较那些字符串值

   if(var1.CompareTo(var2)==0)

【讨论】:

  • 能否请您发布您的代码,以便提供帮助
猜你喜欢
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 2019-05-21
相关资源
最近更新 更多