2016-08-25 7 views
5

次のコードは動作します:「Newtonsoft.Json.Linq.JToken get_Item(可能System.String)」メソッドを認識しない方法、

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) 
{ 
    // ... 

しかし、私が代わりに変数を使用してみてくださいハードコーディングされた値:問題は非常によくexceのメッセージによって記述されて

LINQ to Entities does not recognize the method 'Newtonsoft.Json.Linq.JToken get_Item(System.String)' method.

答えて

1

:私はこのエラーを取得する

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) 
{ 
    // ... 

ption。 Basicalyエンティティフレームワークは(ESQLに変換されたエンティティにLINQ)SQLにそれを翻訳カント

ソリューションは、あなたがWhere

P.S.を使用する前に.ToList()を呼び出すことですはい、私はそれがメモリにすべてをロードするので、それは非常に良いではないことを知っています。

10

メッセージはかなり自明です。 Where呼び出しに渡された式は、後でEFによってSQLに変換されます。 EFはJTokenのプロパティインデクサーをどのように翻訳するのか分かりませんので失敗します。

これを回避するには、値を式の外に取得します。ラムダでこれを参照すると、作成された式に '定数'が返されます。

余談として
var deviceKey = o["deviceKey"].ToString(); 

var disp = db.Dispositivos 
    .Where(p => p.ClaveDispositivo == deviceKey); 

、あなたはそれはあなたがチェックしたいすべてだ場合disp.Any()を呼び出す(またはAnyWhereを交換)したほうが良いと思います。 ToListを呼び出すと、すべてのデータが取得され、無視されるためにのみ実現されます。

0

使用デリゲート:

var disp = db.Dispositivos.Where(delegate(Dispositivos p) 
{ 
    return p.ClaveDispositivo == o["deviceKey"].ToString(); 
}); 
関連する問題