2011-06-26 122 views
12

我有兩個表:車輛和工人。聯盟在實體框架

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

我想寫lambda查詢返回所有的車輛和承包商的車輛。喜歡的東西在SQL:

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

這是我編:

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; 
} 

但我得到一個異常:

實體或複雜類型 'XXXXXXXX' 不能在構造LINQ to Entities查詢。

回答

9

不能構造映射在投影實體類型。

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 
} 

而且你的方法是這樣的::

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

你不能在select語句中創建實體。試試這個:

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; 
} 

也確定要一個Union,而不是一個Concat

+0

我需要整個車輛對象,如果您創建用於投影一個新的特殊類型的前車可鑑只會工作。 Union和Concat有什麼不同? – Naor

+3

'Concat'返回兩個查詢的完整結果,'Union'刪除重複項。 – Magnus

-4

嘗試了這一點...

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

,並返回這樣

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

這甚至不會編譯。你如何期望實例化一個接口? –