LINQ to Entities不认识方法'Boolean ToBoolean'

5

我有一个类像这样:

public class menu{
public string Permission{get;set;}
}

Permission的值已加密。我想要所有PermissionTrue的记录。为了做到这一点,我使用以下查询:

return 
_menuSettings.Where(row => Convert.ToBoolean(Utilities.Encryption.Decrypt(row.Permission,"key"))==true).ToList();

但我遇到了这个错误:

LINQ to Entities不识别“Boolean ToBoolean(System.String)”方法,此方法无法转换为存储表达式。

我在Google上搜索过,但是仍然解决不了它。

谢谢。


2
Convert.ToBoolean无法转换为T-SQL,Linq to Entities无法识别它。请查看此问题:http://stackoverflow.com/questions/34061637/linq-to-entities-does-not-recognize-the-method-system-web-mvc-fileresult/34061692#34061692 - Salah Akbari
2个回答

3

您所要求的内容无法通过数据库查询实现。恐怕您只能使用内存过滤(希望您的记录不是太多)来实现,示例如下:

return 
_menuSettings.AsEnumerable().Where(...

这里的 AsEnumerable() 会将上下文从 Linq to Entities 切换到 Linq to Objects


2

并非所有的方法都可以转换为SQL,这是该消息的核心。

在您的情况下,您可以与字符串"true"进行比较。

_menuSettings.Where(row => Utilities.Encryption.Decrypt(row.Permission,"key").ToLower()=="true").ToList();

如前所述,该消息意味着该方法无法转换为SQL。因此,毫不奇怪的是,Utilities.Encryption.Decrypt 也不受支持。

然后继续采用相同的概念,将不起作用的内容从查询中删除。

快速而简单的方法是实现/投影数据(在使用不受支持的筛选器之前,请使用 ToList()ToIEnumerable())。

这意味着您将所有内容从表格中取出,并在服务器上进行过滤,而不是在DBMS(SQL服务器)上进行过滤。

就像这样。(我已将其拆分成多行以提高可读性)

var projection = _menuSettings.ToList();
var result = projection.Where(row => Utilities.Encryption.Decrypt(row.Permission,"key").ToLower()=="true").ToList();

一个明智的选择是在进行这样的重型工作之前,找到一种好的方法来限制投影尺寸。

2
现在他将会收到“Utilities.Encryption.Decrypt”不支持的信息。 - Ivan Stoev
我遇到了这个错误 LINQ to Entities不认识方法'System.String Decrypt(System.String, System.String)',该方法无法转换为存储表达式。 - Psar Tak

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