【问题标题】: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();
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-07
          • 1970-01-01
          • 2019-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多