【问题标题】:Union IQueryable and List联合 IQueryable 和列表
【发布时间】:2014-11-11 06:51:05
【问题描述】:

这是我的代码:

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)

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

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

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

【问题讨论】:

标签: c# entity-framework linq-to-entities entity-framework-6


【解决方案1】:

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

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

您应该:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2013-05-27
      • 1970-01-01
      相关资源
      最近更新 更多