2012-04-10 85 views
0

我正在执行查询,在该查询中将查询投影到使用列表的业务对象中。问题是Linq对实体抱怨说:“LINQ to Entities只支持无参数的构造函数和初始化器。”投影包含列表的新项目

我一直在拉我的头发在这一个。我的查询看起来是这样的:

var q = from d in db.Items select new BusinessObject 
    { 
     MyList = new List<MyObject>(d.Select(x => new MyObject {// set fields}) 
    } 

我不能使用初始化为似乎只接受一个单一的项目,还没有收集。我不能做一个.ToList(),因为EF然后抱怨它不知道MyObject的列表是什么(显然,它试图将它转换为SQL)。

我无法在查询之外创建列表,因为我需要父表中每一行的新列表。

此处有任何建议吗?

+0

@HenkHolterman - 的定义是不相关的,除了一个事实,即MYLIST是一个列表(这是从代码明显)。 MyObject中的字段是不相关的,并且与问题无关。 – 2012-04-10 21:59:03

回答

0

该查询看起来很奇怪 - 什么是db?它应该是你的上下文还是你的上下文的IQueryable属性?

假设您的上下文,您可以尝试在查询BusinessObject集合时加载items属性(这是什么?)的集合,然后转换为List,然后将items属性项目投影到List上内存中的集合:

var q = db.BusinessObjectsContextProperty.Select(d => d.items) //eager load the items property 
    .ToList() // get it into memory 
    .Select(d => new BusinessObject { MyList = d.items 
     .Select(item => new MyObject { ... }) // project the in-memory list 
    ); 
+0

对不起,在查询的第一部分中的拼写错误,应该是db.Items(是的,它是一个DbSet)。这是一个更复杂的查询的大大简化。将它拉到最上面的内存将导致数十万条记录被带入内存。 – 2012-04-10 22:08:52

+1

如果你在正确的位置执行ToList,它不应该导致更多的行比必要的被带入内存,如果它..? – 2012-04-10 22:12:57