合并从不同表中投射到一个实体的两个iqueryable

我试过这个答案 , 这一个和这个合并两个iqueryables。 但我总是收到以下错误:

“Estudio”类型出现在单个LINQ to Entities查询中的两个结构不兼容的初始化中。 可以在同一查询中的两个位置初始化类型,但前提是在两个位置都设置了相同的属性,并且这些属性以相同的顺序设置。

我正在从两个不同但相似的entity framework实体(EXAMEN和EXPLORACION)映射到我的域实体Estudio,具有以下代码。

IQueryable listExamen = context.Set().Project().To(); IQueryable listExploracion = context.Set().Project().To(); var listCombined = listExamen.Concat(listExploracion); 

无论如何使用两个列表的合并生成IQueryable(不可枚举)? 如果使用AsEnumerable() ,则在内存上执行以下filter(Order,Take等)。 所以我需要合并列表,但仍然能够将filter应用于合并列表而不执行查询。

 //This will force the next condition is executed on memory var listCombined = listExamen.AsEnumerable().Concat(listExploracion); 

那可能吗?

我会尝试在您的linq查询中选择您的数据为匿名类型,执行联合,并添加您的条件。

 var listExamen = context.Examen .Select(x => new { x.Prop1, x.Prop2, ... }); // Add properties var listExploracion = context.Exploraction .Select(x => new { x.Prop1, x.Prop2, ... }); // Add identical properties var listCombined = listExamen.Concat(listExploracion); var whereAdded = listCombines .Where(x => x.Prop1 == someValue); var result = whereAdded .Skip(skipCount) .Take(takeCount) .ToList(); 

注意:我不知道你是否可以结合使用公用表表达式(跳过/取的SQL必要性)

注意:我已经改变了用于创建表达式的方法,因为我不知道你的方法( ProjectTo

所以我认为解决方案不是转换为特定类型,而是转换为匿名类型,因为这可能会被转换为SQL。

警告:没有测试

我的解决方案是修改我的映射代码。 我不必使用单独的基于属性的映射器,而是必须立即投影整个实体,确保所有属性都以相同的顺序给出。

所以,而不是ForMember语法:

 Mapper.CreateMap() .ForMember(p => p.Name, cfg => cfg.MapFrom(c => c.Person.FirstName + " " + c.Person.LastName)) ... 

我使用了ProjectUsing语法:

 Mapper.CreateMap() .ProjectUsing(c => new PersonResult() { Name = c.Person.FirstName + " " + c.Person.LastName ... }); 

这必须是因为AutoMapper构建其投影的方式。

解决此问题的一种方法是添加虚拟类型:

 class Estudio : Estudio { } 

和新的映射:

 Mapper.CreateMap(); Mapper.CreateMap>(); Mapper.CreateMap>(); 

需要注意的是, Estudio中的所有字段都需要一些映射值。 你不能使用忽略。 返回0""是好的。 现在我们可以做到:

 var a = context.Set().ProjectTo>(); var b = context.Set().ProjectTo>(); return a.ProjectTo().Concat(b.ProjectTo());