在EF Core 7中,Guid CompareTo方法没有被翻译。

3
我在EF 6中使用了以下的EF Core Linq查询,其中PK是一个Guid,并且它运行正常。
var partialSCs = repository.MyClass
                           .Where(x => x.PK.CompareTo(pk) > 0))
                           .OrderBy(x => x.PK)
                           .Take(10);

EF Linq查询成功转换为SQL查询。

然后我们切换到EF Core 7,现在我遇到了这个错误:

: 'LINQ表达式'DbSet() .Where(s.PK.CompareTo((object)__pk_2) > 0)' 无法翻译。附加信息:方法'System.Guid.CompareTo'的翻译失败。 如果此方法可以映射到您的自定义函数,请参阅https://go.microsoft.com/fwlink/?linkid=2132413获取更多信息。 要么将查询重写为可以翻译的形式,要么显式地切换到客户端评估,通过插入调用'AsEnumerable'、'AsAsyncEnumerable'、'ToList'或'ToToListAsync'。请参阅https://go.microsoft.com/fwlink/?linkid=2101038获取更多信息。

我已经阅读了以下文章:

如何在Linq to Entities中比较两个GUID

Entity Framework Core: Guid Greater Than for Paging

他们说的是CompareTo必须起作用。但在我的情况下并没有。


听起来似乎与SQL Server标签无关,但您可能想要添加C#和.NET。 - Dale K
为什么不直接使用 .Where(x => x.PK > pk) 呢? - Charlieface
@Charlieface 这个不起作用。它给我一个编译错误:操作数“>”不能应用于类型为“Guid”和“Guid”的操作数。 - elahehab
由于某种原因,他们没有添加该方法的翻译,而且出于某种未知的原因,Guid 类型不像其他类型一样提供比较运算符(同样适用于 string)。在重复目标中提供了解决方法。 - Ivan Stoev
4
我找到问题了!实际上,EF可以翻译两个Guid对象的CompareTo方法。我的问题是其中一个Guid是可空的,就像是Guid.CompareTo(Guid?)这样。所以它无法进行翻译。 - elahehab
@elahehab 所以他们肯定在某个后续版本(5、6、7谁知道)中添加了Guid.CompareTo(Guid)的翻译。而你遇到的是Guid.CompareTo(object)的重载(没有Guid?的重载),这是正常无法翻译的。实际上,错误消息中已经显示了(这里的object转换 s.PK.CompareTo((object)__pk_2) > 0),一开始没有注意到。重新打开,这样你就可以为未来的读者发布一个自我回答。 - Ivan Stoev
1个回答

1
我找到问题了!实际上,EF可以翻译两个Guid对象的CompareTo方法。我的问题是其中一个Guid是可空的,就像是Guid.CompareTo(Guid?)这样。所以它无法翻译。
从错误中可以看出:DbSet().Where(s.PK.CompareTo((object)__pk_2) > 0) 它试图将__pk_2强制转换为object类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接