C# 联合索引和列表

C# 联合索引和列表,c#,entity-framework,linq-to-entities,entity-framework-6,C#,Entity Framework,Linq To Entities,Entity Framework 6,这是我的代码: var query = context.SomeEntities.Select(e => new SomeDto { Name = e.Title, }) 变量查询是IQueryable var list = new List<SomeDto> { new SomeDto { Name = "SomeName1" }, new SomeDto {

这是我的代码:

var query = context.SomeEntities.Select(e => new SomeDto
{
    Name = e.Title,       
})
变量查询是IQueryable

var list = new List<SomeDto>
{
    new SomeDto
    {
          Name = "SomeName1"      
    },
    new SomeDto
    {
          Name = "SomeName2"      
    }
};
但在这个地方我有例外

无法创建“SomeDto”类型的常量值。在此上下文中仅支持基元类型或枚举类型


我知道我可以在第一次收集时使用ToList(),但我需要不调用数据库的联合收集。我如何才能做到这一点?

正如user3825493所指出的,对于类似的问题,有一些答案。第一个链接基本上解释了整个过程

您的问题是,由于
Union
映射到SQL Union,因此操作的参数将转换为实体框架可接受的数据类型。但是,对于
IEnumerable
输入参数中的项,它可以接受的唯一类型是,如您得到的错误中所指定的,基元类型和枚举

你应该:

var unionOfQueryWithList = query.AsEnumerable().Union(list)
或者,如果您喜欢使用SQL工具,请编写一个存储过程,将联合作为其逻辑的一部分执行,并找到将数据传递到SQL的方法,例如

前者在执行联合之前将查询的所有结果加载到内存中。当您从EF返回了所有预过滤的数据,并且只想在代码中使用输出进行后续处理时,这种方法非常方便


后者将您带出EF区域,并且在您有操作时是必需的,这些操作将受益于在SQL引擎上运行,例如根据您在代码中可以访问的复杂数据过滤或加入DB数据。

您可以将查询转换为IEnumerable,也可以尝试以下操作:

list.Union(query); // use Union() of list not query :)
it will work and you still don't need to get data from DB you can reverse the order if you want :)

[参考这两个链接][1][1]:[1]:希望这会有所帮助you@user3825493,这些问题是关于联合两个IQueryable集合的,但在我的例子中,一个集合IQueryable,另一个列表
list.Union(query); // use Union() of list not query :)
it will work and you still don't need to get data from DB you can reverse the order if you want :)