我正在尝试使用动态数据并使用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查询的例子,它似乎没有遇到这个重复的结果问题......我忽略了什么?
答案 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;