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。真的吗?

C# LINQ to Entities 无法识别方法“布尔”

我如何修复“LINQ to Entities无法识别方法”错误