不能在动态查询中使用LINQ而不出错

本文关键字:LINQ 出错 动态 查询 不能 | 更新日期: 2023-09-27 18:14:21

我试图在其父动态列表内的动态列表上使用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表达式强制转换为委托或表达式树类型,则不能将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. '"列表"不包含"选择"的定义

不能在动态查询中使用LINQ而不出错

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

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()
});

我个人看不出在这种情况下使用动态会给表带来什么好处,除了混淆。