如何在子查询中引用JToken集合中的所有元素

时间:2019-04-23 13:34:21

标签: c# json linq json.net

我有一种方法(与CSOM Sharepoint分类有关),该方法可以根据特定参数从子查询集合中返回特定元素

当前,它仅返回集合中的第一个元素或最后一个元素;但是,我想返回所有元素,包括第一个和最后一个

我不想更改代码的结构,只想修改它们以保持LINQ格式

请让我知道如何正式完成

    public List<JToken> GetSubTermsByTermName(string type, string termName)
    {
        var termSetTerms =
            from t in Terms
            where (string)t["type"].First == type
            select t;

        var rootTerms = termSetTerms.Where(t =>

        termSetTerms.Any(u =>
            ((string)u["label"] == (string)t["sub_class_of"].First["label"]
                && (string)t["sub_class_of"].First["label"] == termName)  ||
            ((string)u["label"] == (string)t["sub_class_of"].Last["label"]
                && (string)t["sub_class_of"].Last["label"] == termName)));

        return rootTerms.ToList<JToken>();
    }

这是我要阅读的JSON代码段

   "results":[
      {
         "id":"id",
         "label":"label",
         "type":[
            "my type"
         ],
         "sub_class_of":[
            {
               "id":"parentid1",
               "label":"parentlabel1"
            },
            {
               "id":"parentid2",
               "label":"parentlabel2"
            },
            {
               "id":"parentid3",
               "label":"parentlabel3"
            }
         ]
    }

1 个答案:

答案 0 :(得分:0)

现在我决定更改代码的结构,以后我可能会将其更改为linq join,但现在可以正常使用

public List<JToken> GetSubTermsByTermName(string type, string termName)
{
    var termSetTerms =
        from t in Terms
        where (string)t["type"].First == type
        select t;

    List<JToken> subClasses = new List<JToken>();
    foreach (var rootTerm in termSetTerms)
    {
        if (rootTerm["sub_class_of"].Count() > 0)
        {
            foreach(var subClassOf in rootTerm["sub_class_of"])
            {
                if ((string)subClassOf["label"] == termName)
                {
                    subClasses.Add(rootTerm);
                }
            }
        }
    }

    return subClasses;
}