以下代码有效:
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)'方法。
答案 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();
});