代码之家  ›  专栏  ›  技术社区  ›  Ambidex

嵌套Linq查询返回三倍的结果?

  •  1
  • Ambidex  · 技术社区  · 8 年前

    我正在尝试处理动态数据,在LINQ上遇到了一些奇怪的事情,我在网上找不到太多信息。我想指出,我遇到的这个问题发生在任何嵌套集合上。

    我想收集动态数据,然后用where查询对其进行过滤。where查询只是检查所有的值,看看它是否包含“FL”,然后我希望它返回动态集合。。。不仅仅是包含FL的字段。

    我在where子句中显式地输入了类型,以便于在线阅读,否则它是多余的。

            IEnumerable<dynamic> query = from agent in agentRecords
                from values in (ExpandoObject)agent
                where ((KeyValuePair<string, object>)values).Value.ToString().Contains("FL")
                select agent;
    

    查询正常,但返回 3次 预期结果。(我得到了9个代理,而不是3个,多个副本。)

    我可以通过调用distinct来过滤它,但有些事情告诉我我做得不对。

    另一种方法是使用LINQ扩展方法

    var result = agentRecords.Cast<ExpandoObject>().Where(x => x.Any(y => y.Value.ToString().Contains("FL")));
    

    根据 https://docs.microsoft.com/en-us/dotnet/csharp/linq/query-expression-basics ,有多个“多个/嵌套自”linq查询的示例,它似乎没有遇到这种重复结果问题。。。我忽略了什么?

    2 回复  |  直到 8 年前
        1
  •  2
  •   NetMage    8 年前

    而不是将每个代理与其 values ,测试每个代理一次:

    IEnumerable<dynamic> query = from agent in agentRecords
                                 where (from values in (ExpandoObject)agent
                                        select ((KeyValuePair<string, object>)values).Value.ToString().Contains("FL")).Any()
                                 select agent;
    

    Lambda语法对我来说似乎更清楚,它看起来与您的表达式相同:

    IEnumerable<dynamic> query2 = agentRecords.Where(agent => ((ExpandoObject)agent).Any(((KeyValuePair<string, object>)values).Value.ToString().Contains("FL")));
    
        2
  •  0
  •   cheip    8 年前
    from a in agentRecords
    where (from i in (ExpandoObject)a
           where (((KeyValuePair<string, object>)i).Value.ToString().Contains("FL")
           select i).Count() > 0
    select a;