在 LINQ to Entities 中将 GUID 与字符串进行比较会引发错误。

6

编辑:这不是重复的问题。建议的 SO 链接要求我调用 ToString(),但我正在运行一个 .COUNT() 并尝试进行大于比较,因此调用 ToString() 不是正确的答案。

我正在尝试使用 IF 快捷方式来填充一个变量,但当我运行它时,我收到以下错误:

LINQ to Entities 不识别 'System.Guid Parse(System.String)' 方法,并且此方法无法转换为存储表达式。

我运行的代码是:

IsAdmin = (db.yaf_prov_RoleMembership
             .Where(rm => rm.UserID == UserKey
                          && rm.RoleID == Guid.Parse("adsfasd654asdf816asdf"))
             .Count() > 0) ? true : false;

如果我去掉 Guid.Parse 直接进行比较,那么就会出现如下错误:

无法将类型 System.Guid 和 String 进行运算符 == 的操作数。

在 LINQ 查询中,如何才能将 GUID 和字符串进行比较?


RoleID 的类型是什么? - Selman Genç
点击此处阅读。 - Zafar
我看到了这两个帖子,但如果我使用 ToString(),那么我就无法运行 .Count() 并进行比较。 - Matthew Verstraete
2
在将其存储在变量adminGuid中之前,请执行guid.parse操作。然后使用Guid或Guid.ToString()进行比较,使用String.Equals(str1, str2)方法。 - Pieter21
@Pieter21所说的没错。问题不在于将字符串解析为GUID,而在于LINQ试图将该函数传递给EF提供程序,而它不知道如何将字符串解析为GUID。 - vlad
显示剩余3条评论
2个回答

23

不知道 Dave 为什么删除了他的回答 - 你应该将字符串解析移出存储表达式。否则,Entity Framework 会尝试将 Guid.Parse 方法调用转换为 SQL,但无法完成:

var adminRoleID = Guid.Parse("adsfasd654asdf816asdf");

还可以使用 Queryable.Any 来简化查询:

IsAdmin = db.yaf_prov_RoleMembership
            .Any(rm => rm.UserID == UserKey && rm.RoleID == adminRoleID);

1
你的第一个错误响应中关键的部分是: [...] 转换为存储表达式 。 如果你先解析 guid 并将其存储在变量中,我认为它应该可以工作:
 var guid = Guid.Parse("adsfasd654asdf816asdf");
 IsAdmin = db.yaf_prov_RoleMembership
             .Any(rm => rm.UserID == UserKey && rm.RoleID == guid );

每当您执行LINQ查询的“东西”不知道如何处理的操作时,都会收到此错误。在这种情况下,实体框架不知道如何将Guid.Parse转换为SQL语句/“存储表达式”。

你甚至没有将 adminRoleID 重命名为 guid - Sergey Berezovskiy
@SergeyBerezovskiy 我怀疑这不是复制粘贴,两个回答在1分钟内完成,而且只有一种方法可以编写此代码。如果是我,我会完全相同的方式编写它。如果你 downvote 了,我建议你撤销。 - Ronan Thibaudau
我之前回答了完全相同的问题,虽然我认为在我的编辑消息中包含了对你的归属,但显然我没有。 - AlexanderBrevig
@RonanThibaudau 我只在完全确定时才写有关复制粘贴的内容:https://www.dropbox.com/s/f8yjy9ujgrm0ae8/Screenshot%202014-08-18%2002.31.15.png,正如您所看到的,这个答案没有被踩。 - Sergey Berezovskiy
由于您已经为他的代码添加了说明,我会点赞您的回答。我添加那个“编辑”实际上是为了向您致谢,但我做得不好,所以请原谅。 - AlexanderBrevig

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