LINQ to Entities 无法识别方法 'Newtonsoft.Json.Linq.JToken get_Item(System.String)' 方法,
Posted
技术标签:
【中文标题】LINQ to Entities 无法识别方法 \'Newtonsoft.Json.Linq.JToken get_Item(System.String)\' 方法,【英文标题】:LINQ to Entities does not recognize the method 'Newtonsoft.Json.Linq.JToken get_Item(System.String)' method,LINQ to Entities 无法识别方法 'Newtonsoft.Json.Linq.JToken get_Item(System.String)' 方法, 【发布时间】:2017-01-02 02:54:04 【问题描述】:以下代码有效:
string data = Encoding.UTF8.GetString(eventData.GetBytes());
JObject o = JObject.Parse(data);
var disp = db.Dispositivos
.Where(p => p.ClaveDispositivo == "UM5WOkRIFtS9dWbM5f1YM/ncpdrpSYrh3zND9Y/YHM4=");
if(disp.ToList().Count > 0)
// ...
但是,当我尝试使用变量而不是硬编码值时:
string data = Encoding.UTF8.GetString(eventData.GetBytes());
JObject o = JObject.Parse(data);
var disp = db.Dispositivos
.Where(p => p.ClaveDispositivo == o["deviceKey"].ToString());
if(disp.ToList().Count > 0)
// ...
我得到这个错误:
LINQ to Entities 无法识别“Newtonsoft.Json.Linq.JToken get_Item(System.String)”方法。
【问题讨论】:
【参考方案1】:该消息是不言自明的。传递给Where
调用的表达式稍后由 EF 转换为 SQL。 EF 不知道如何翻译 JToken
上的属性索引器,所以它失败了。
您可以通过获取表达式之外的值来解决此问题。在您的 lambda 中引用它会在创建的表达式中产生一个“常量”。
var deviceKey = o["deviceKey"].ToString();
var disp = db.Dispositivos
.Where(p => p.ClaveDispositivo == deviceKey);
顺便说一句,如果您只想检查这些,最好致电disp.Any()
(或将Where
替换为Any
)。调用ToList
将导致所有数据被检索和具体化,只是为了忽略它。
【讨论】:
【参考方案2】:异常消息很好地描述了问题。基本上实体框架无法将其转换为 SQL(LINQ to entity 转换为 ESQL)
解决方法是在使用Where
之前调用.ToList()
附:是的,我知道它不是很好,因为它会将所有内容加载到内存中。
【讨论】:
【参考方案3】:使用委托:
var disp = db.Dispositivos.Where(delegate(Dispositivos p)
return p.ClaveDispositivo == o["deviceKey"].ToString();
);
【讨论】:
以上是关于LINQ to Entities 无法识别方法 'Newtonsoft.Json.Linq.JToken get_Item(System.String)' 方法,的主要内容,如果未能解决你的问题,请参考以下文章
LINQ to Entities 无法识别方法 IsNullOrWhiteSpace
错误:LINQ to Entities 无法识别方法 DataLength
LINQ To Entities 无法识别方法 Last。真的吗?
LINQ To Entities 无法识别方法 Last。真的吗?