【问题标题】: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)”方法。
【问题讨论】:
标签:
c#
arrays
json
entity-framework
linq
【解决方案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();
});