无法在没有错误的情况下在动态查询中使用LINQ

时间:2015-09-23 21:46:12

标签: c# asp.net linq dynamic expression

我正在尝试在其父动态列表中的动态列表中使用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
 });

运行时异常:&#39; System.Collections.Generic.List&#39;不包含&#39;选择&#39;

的定义

1 个答案:

答案 0 :(得分:0)

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

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

在这种情况下,除了混乱之外,我个人看不到使用动力学带来什么好处。