entity framework中的联盟

我有两张桌子:车辆和工人。

Vehicle(Id, Number) Workers(Id, Name, ContractorVehicleNumber) 

我想写lambda查询来返回所有车辆和承包商车辆。 像sql中的东西:

 SELECT Id, Number FROM Vehicle UNION SELECT NULL, ContractorVehicleNumber FROM Workers 

这就是我所做的:

 public IQueryable Get(bool includeContractorVehicles) { IQueryable query = GetQuery(); if (includeContractorVehicles == true) { WorkerRepository rep = new WorkerRepository(); IQueryable contractorsVehicles = rep.GetWirkers(). Select(x => new Vehicle() { VehicleNumber = x.ContractorVehicleNumber }); query = query.Union(contractorsVehicles); } return query; } 

但我得到一个例外:

无法在LINQ to Entities查询中构造实体或复杂类型“XXXXXXXX”。

您无法在投影中构造映射的实体类型。 您之前的示例仅在您创建用于投影的新特殊类型时才有效:

 public class VehicleResult { public string Number { get; set; } ... // If you don't need more then one column you can use simple type instead of custom class } 

你的方法看起来像:

 public IQueryable Get(bool includeContractorVehicles) { IQueryable query = GetQuery().Select(v => new VehicleResult { ... }); if (includeContractorVehicles == true) { WorkerRepository rep = new WorkerRepository(); IQueryable contractorsVehicles = rep.GetWorkers(). Select(x => new VehicleResult() { Number = x.ContractorVehicleNumber }); query = query.Union(contractorsVehicles); } return query; } 

您无法在select语句中创建实体。 试试这个:

 public class VehicleDTO { public int Id { get; set; } public int Number { get; set; } } public IQueryable Get(bool includeContractorVehicles) { var query = GetQuery().Select(x => new VehicleDTO(){ ID = c.ID, Number = c.Number }); if (includeContractorVehicles) { WorkerRepository rep = new WorkerRepository(); var contractorsVehicles = rep.GetWirkers(). Select(x => new VehicleDTO(){ Number = x.ContractorVehicleNumber}); query = query.Union(contractorsVehicles); } return query; } 

你确定你想要一个Union而不是Concat吗?