【问题标题】:Using Linq.Dynamic where method with a dynamic list gives error使用带有动态列表的 Linq.Dynamic where 方法会出错
【发布时间】:2017-02-13 16:25:52
【问题描述】:

我正在阅读一些 JSON 并将其转换为动态列表。 以下是我的代码:

dynamic data = JObject.Parse(response);
var result = data.result;
var result = ((IEnumerable)arr).Cast<dynamic>().ToList();

var id = result[0].id;
var filtereddata = result.Where("id==1");

线

var filtereddata = result.Where("id==1");

var id = result[0].id; 似乎工作时给出错误No property or field 'id' exists in type 'Object

我正在解析的 JSON 是:

{
"count": 1,
"result": [
{
  "id": 11,
  "name": "Locations",

}]
}

如果需要更多信息,请告诉我。感谢您宝贵的时间。

编辑: 甚至尝试使用 lambda 表达式 var filtereddata = result.Where(c=&gt;c.id==1).Select("id");,但仍然是同样的问题。

【问题讨论】:

  • 我认为 Dynamic LINQ 不适用于 dynamic 类型。
  • 为什么是动态的?为什么不是poco? json2csharp.com
  • 我不能使用 poco,并且确切的字段可能会有所不同。所以必须使用动态。如果有除 Dynamic Linq 之外的任何解决方案,我也可以检查一下
  • 常规 LINQ 怎么样?例如Where(x =&gt; x.id == 1).
  • 实际上我将 where 条件作为字符串“id==1”。所以这就是我使用动态 Linq 的原因

标签: c# linq dynamic dynamic-linq


【解决方案1】:

动态 LINQ 不适用于 dynamic 类型。 LINQ to Objects 可以工作,但由于您收到的过滤器为string,因此不适用。

解决方法是在应用动态Where 之前使用临时匿名投影,然后选择回原始对象:

var filtereddata = result
    .Select(x => new { item = x, id = (int)x.id, name = (string)x.name })
    .Where("id==1")
    .Select(x => x.item);

【讨论】:

  • 如果匿名投影到一个明确的定义是可行的,那么为什么首先创建IEnumerable&lt;dynamic&gt;,可以直接创建一个schema post Json read
  • @MrinalKamboj 我不知道为什么 OP 选择解析成 JObject,它在内部创建 dynamic JArray / JObject / JProperty。答案只是涵盖了具体的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
相关资源
最近更新 更多