【问题标题】:Can't use LINQ in Dynamic Query without errors无法在 Dynamic Query 中使用 LINQ 而不会出现错误
【发布时间】:2015-12-21 09:21:23
【问题描述】:

我正在尝试在其父动态列表内的动态列表上使用 LINQ。变量c.characterBase.peerView.equipment 的类型为JArray。我的目标是让EquipmentList 属性成为字符串列表,但它目前是一个对象列表,每个对象都有一个字符串属性。

dynamic dynamicData = JsonConvert.DeserializeObject(result);
IEnumerable<dynamic> list = dynamicData.Response.data.characters;
var characters = list.Select(c => new CharacterModel
{
     ///other properties
     EquipmentList = c.characterBase.peerView.equipment
     .ToObject<List<Equipment>>().Select(p => new
      {

      })
});

编译错误:不能将 lambda 表达式用作动态分派操作的参数,除非先将其转换为委托或表达式树类型。

dynamic dynamicData = JsonConvert.DeserializeObject(result);
IEnumerable<dynamic> list = dynamicData.Response.data.characters;
Func<dynamic, string> function = equipment => equipment.itemHash;
var characters = list.Select(c => new CharacterModel
{
     ///other properties
     EquipmentList = c.characterBase.peerView.equipment
     .ToObject<List<Equipment>>().Select(function)//.Select("itemHash") fails using System.Linq.Dynamic as well
 });

运行时异常:“System.Collections.Generic.List”不包含“Select”的定义

【问题讨论】:

  • 我对此有点困惑。 function 的签名不应该是 Func&lt;Equipment, string&gt;,而不是 Func&lt;dynamic,string&gt;
  • 可能,但我从来没有得到过这样的结果,因为我收到运行时错误说“选择”丢失。
  • 反对哪个Select,你知道吗? ToObject 之后的那个还是list 上面的那个?
  • 另外,我想知道这是否正在发生,因为Select 是一种扩展方法。它实际上并不属于IEnumerableList。我相信是编译器将对象与其扩展方法相关联,而不是运行时。
  • @AnnL。我相信你在那里是正确的。我只是想找到这种事情的最佳实践,因为我确信这是可能的。

标签: c# asp.net linq dynamic expression


【解决方案1】:

如果您不能使用它,请不要使用它。你可以这样做:

JObject data = JObject.Parse(result);
JArray list = (JArray)data.SelectToken("Response.data.characters");
var characters = list.Select(c => new CharacterModel
{
    //other properties
    Other = c.Value<int>("otherProperty"),
    EquipmentList = ((JArray)c.SelectToken("characterBase.peerView.equipment"))
        .Select(p => p.Value<string>("itemHash")).ToList()
});

我个人认为在这种情况下使用动态不会带来什么好处,除了混乱。

【讨论】:

  • 感谢您的建议。我更喜欢你的方法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
相关资源
最近更新 更多