我有一个这样的类:
public class menu{
public string Permission{get;set;}
}
Permission
的值被括起来。我想要Permission
是True
的所有记录。为此,我使用以下查询:
return
_menuSettings.Where(row => Convert.ToBoolean(Utilities.Encryption.Decrypt(row.Permission,"key"))==true).ToList();
但我得到了这个错误:
LINQ to Entities无法识别"Boolean ToBoolean(System.String)"方法,并且此方法无法转换为存储表达式。
我在谷歌上搜索过,但无法解决。
感谢
您想要的是数据库查询无法实现的。恐怕你被内存中的过滤卡住了(希望你的记录不要太多),比如这个
return
_menuSettings.AsEnumerable().Where(...
此处AsEnumerable()
将上下文从Linq to Entities
切换到Linq to Objects
不是每个方法都可以转换为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();
一个明智的选择是在你做这样的繁重工作之前,找到一个限制投影大小的好方法。