LINQ to Entities不识别方法';布尔值到布尔值

本文关键字:布尔值 方法 to Entities 识别 LINQ | 更新日期: 2023-09-27 18:27:25

我有一个这样的类:

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)"方法,并且此方法无法转换为存储表达式。

我在谷歌上搜索过,但无法解决。

感谢

LINQ to Entities不识别方法';布尔值到布尔值

您想要的是数据库查询无法实现的。恐怕你被内存中的过滤卡住了(希望你的记录不要太多),比如这个

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();

一个明智的选择是在你做这样的繁重工作之前,找到一个限制投影大小的好方法。