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

时间:2018-03-30 16:29:33

标签: c# linq dynamic

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

我想获取动态数据的集合,然后使用where查询过滤它。查询只是检查所有值以查看它是否包含“FL”,然后我希望它返回动态集合...而不仅仅是包含FL的字段。

我已明确地在where子句中输入类型以使其更容易在线阅读,否则它是多余的。

Any()

查询有效,但返回 3次预期结果。(我得到9个代理而不是3个,多个重复。)

我可以通过调用distinct来过滤它,但有些东西告诉我我没有这样做。

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

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

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

2 个答案:

答案 0 :(得分:2)

不是将每个代理与其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")));

答案 1 :(得分:0)

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;