【问题标题】:How to resolve variable in Linq Query c#?如何在 Linq Query c# 中解析变量?
【发布时间】:2018-10-17 05:42:44
【问题描述】:

我有下面的动态数组

dynamic[] queueList = await queueInfo.Run.GetData<dynamic[]>(Name);

我想获取 ImportTableName 字段中存在的唯一值。所以,经过一番搜索,我发现了这个,

var distNames = queueList.Select(o => new {o.ImportTableName }).Distinct();

按预期工作。

但我不想硬编码字段名“ImportTableName”。所以尝试做这样的事情

dynamic[] queueList = await queueInfo.Run.GetData<dynamic[]>(Name);
string tableName = "ImportTableName"
var distNames = queueList.Select(o => new {o.tableName }).Distinct();

但它不起作用,结果只是 NULL。有人可以帮我实现这一目标吗?

【问题讨论】:

  • 您尝试的第二种方式是硬编码的,而不是第一种有效的方式。第一种方法是该类的属性,第二种方法是硬编码字符串。
  • @TechYogesh - 我想我没有正确解释它,它并不总是“ImportTableName”,它可以是任何东西。
  • 动态选择 stackoverflow.com/questions/16516971/linq-dynamic-select 而不是之后的 Distinct
  • 为了回答这个问题,我们需要知道动态对象是如何在GetData方法内部生成的。使用反射适用于分配给动态引用的常规 .Net 对象,但不适用于例如扩展对象。见stackoverflow.com/questions/4939508/…
  • queueList.Select(o => o.GetType()) 的结果是什么?

标签: c# arrays linq


【解决方案1】:

因为它是JObject的数组,它有索引器,你可以将它应用到每个元素上以获得所需字段的值:

var distNames = queueList.Select(x => x[tableName]).Distinct().ToList();

【讨论】:

  • 感谢您的宝贵时间。但它不起作用,property 为空。
  • 试试GetField而不是GetProperty,我不知道ImportTableName到底是什么。
  • JsonConvert.DeserializeObject
  • 还有queueList.Select(o =&gt; o.GetType())给我{Name = "JObject" FullName = "Newtonsoft.Json.Linq.JObject"}
  • 如果是 JSON,您可以简单地将其转换为 JObject,然后将其转换为 GetValuetableName 名称的属性。查看更新的答案。
【解决方案2】:

我的解决办法是:

    dynamic[] queueList = new dynamic[]{new { id = 1, ImportTableName = "Data"}};

    string propName = "ImportTableName";    
    var distNames = queueList.Select(d => d.GetType().GetProperty(propName).GetValue(d, null)).Distinct();

它按预期返回“数据”。

【讨论】:

  • 它适用于您的示例,但不适用于我的代码。注意,GetData 返回JsonConvert.DeserializeObject
猜你喜欢
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多