Union IQueryable和List

时间:2014-11-11 06:51:06

标签: 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
    {
          Name = "SomeName2"      
    }
};

现在我需要联合这些集合,我写

query = query.Union(list)

但是在这个地方我得到了异常

  

无法创建类型&#39; SomeDto&#39;的常量值。此上下文仅支持原始类型或枚举类型

我知道我可以为第一个集合做ToList(),但是我需要联合集合而不需要调用数据库。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

正如 user3825493 指出的那样,有类似问题的答案。第一个链接几乎解释了整个事情。

您的问题是,由于Union映射到SQL UNION这一事实,操作的参数将转换为Entity Framework可接受的数据类型。但是,IEnumerable 输入参数中的项目可接受的唯一类型是,如您获得的错误中所指定的,原始类型和枚举。

你应该:

var unionOfQueryWithList = query.AsEnumerable().Union(list)

或者,如果您想使用SQL工具,请编写一个存储过程,该存储过程将union作为其逻辑的一部分执行,并找到将数据传递给SQL的方法,例如this

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

后者将您带出EF区域,并且当您拥有将在SQL引擎上运行时受益的操作时需要,例如根据您在代码中访问的复杂数据过滤或连接数据库数据。

答案 1 :(得分:0)

要么将查询转换为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 :)