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 :)