使用Linq和ToDictionary进行嵌套查询

时间:2011-08-25 11:06:30

标签: linq entity-framework

我使用实体框架4遇到了这个查询的问题:

List<SomeResult> test = (from a in _entities.TableA
                         select new SomeResult
                         {
                            TestB = a.TableB.Name,
                            TestCDict = a.TableC.ToDictionary(x => x.SomeKey, x => x.SomeValue)
                          }).ToList();

它给出了这个错误:

“无法比较'System.Data.Objects.DataClasses.EntityCollection`1'类型的元素。仅支持基本类型(如Int32,String和Guid)和实体类型。”

如何重做此查询以便它可以正常工作?来自a.TableC中的c的_entities.TableA .... ToDictionary(..?

/拉塞

1 个答案:

答案 0 :(得分:3)

问题是,您正在对数据库进行查询。您正在使用的LINQ提供程序实际上不执行您编写的任何操作。它只试图将Select中的所有代码转换为数据库查询。显然,它无法解析真正复杂的状态,就像你用ToDictionary()编写的那样。 您可以简单地将实体中的所有数据加载到内存中,然后执行所有字典内容。然后你的代码将被执行,并且应该可以工作。 像:

List<SomeResult> test = from a in (from aa in _entities.TableA).AsEnumerable())
                         select new SomeResult
                         {
                            TestB = a.TableB.Name,
                            TestCDict = a.TableC.ToDictionary(x => x.SomeKey, x => x.SomeValue)
                          }).ToList();

当然,你可以在内部查询中使用数据库侧过滤(在AsEnumerable()之前)来缩小加载到内存中的数据量。

相关问题