LINQ to Entities无法识别方法'Newtonsoft.Json.Linq.JToken get_Item(System.String)'方法,

时间:2016-08-25 15:31:06

标签: c# arrays json entity-framework linq

以下代码有效:

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)'方法。

3 个答案:

答案 0 :(得分:10)

该消息相当不言自明。传递到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将导致所有数据被检索并实现,只是为了忽略它。

答案 1 :(得分:1)

异常消息很好地描述了这个问题。 Basicaly实体框架无法将其转换为SQL(LINQ to entities转换为ESQL)

解决方案是在使用.ToList()

之前致电Where

P.S。是的,我知道它不是很好,因为它会将所有内容加载到内存中。

答案 2 :(得分:0)

使用委托:

var disp = db.Dispositivos.Where(delegate(Dispositivos p) 
{ 
    return p.ClaveDispositivo == o["deviceKey"].ToString();
});