2011-06-26 26 views
12

Tengo dos tablas: Vehículos y Trabajadores.Unión en el marco de la entidad

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

me gustaría escribir consulta lambda para devolver todos los vehículos y los vehículos de contratistas. Algo así como en SQL:

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

Esto es lo que hice:

public IQueryable<Vehicle> Get(bool includeContractorVehicles) 
{ 
    IQueryable<Vehicle> query = GetQuery(); 

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

    return query; 
} 

pero me da una excepción:

La entidad o complejo 'XXXXXXXX' tipo no puede ser construido en una Consulta LINQ a Entidades.

Respuesta

9

No puede construirse asignada tipo de entidad en la proyección. Su ejemplo anterior sólo funcionará si se crea un nuevo tipo especial que se utiliza para la proyección:

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

Y su método se verá como:

public IQueryable<VehicleResult> Get(bool includeContractorVehicles) 
{ 
    IQueryable<VehicleResult> query = GetQuery().Select(v => new VehicleResult { ... }); 

    if (includeContractorVehicles == true) 
    { 
     WorkerRepository rep = new WorkerRepository(); 
     IQueryable<VehicleResult> contractorsVehicles = rep.GetWorkers(). 
      Select(x => new VehicleResult() 
      { 
       Number = x.ContractorVehicleNumber 
      }); 
     query = query.Union(contractorsVehicles); 
    } 

    return query; 
} 
2

No puede crear entidades en la instrucción de selección. Prueba este lugar:

public class VehicleDTO 
{ 
    public int Id { get; set; } 
    public int Number { get; set; } 
} 

public IQueryable<VehicleDTO> 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; 
} 

también está seguro de que quiere una Union y no un Concat?

+0

necesito todo el objeto del vehículo. ¿Cuál es la diferencia entre Union y Concat? – Naor

+3

'Concat' devuelve el resultado completo de ambas consultas,' Union' elimina los duplicados. – Magnus

-4

Trate de hacer esto ...

var unionResult = Context.Vehicles.Select(s => new {s.id, s.Number}) 
        .Union(Context.Workers{w => new {null, w.ContractorVehicleNumber}) 

y devolver esta forma

return new ((IQueryable<Vehicle>)(unionResult) 
+10

esto ni siquiera se compilará. ¿cómo esperas crear una interfaz? –

Cuestiones relacionadas