LINQ to Entities无法识别方法'布尔ToBoolean

时间:2015-12-20 13:39:57

标签: c# entity-framework linq

我有一个课这样:

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

Permission的值是Encripted。我想要PermissionTrue的所有记录。为此,我使用此查询:

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

但是我收到了这个错误:

  

LINQ to Entities无法识别方法'布尔ToBoolean(System.String)'方法,并且此方法无法转换为商店表达式。

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

谢谢

2 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分:2)

db查询无法实现您的要求。我担心你会被困在记忆过滤中(希望你的记录不会太多)这样的

.app a:link {
  text-decoration: none;
}
.app a:visited  {
  color: red;
}
.app a:hover {
  color: white;
  text-decoration: underline;
}

此处return _menuSettings.AsEnumerable().Where(... 会将上下文从AsEnumerable()切换为Linq to Entities