2011-06-26 37 views
12

Tôi có hai bảng: Xe và Công nhân.Công đoàn trong khuôn khổ pháp nhân

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

Tôi muốn viết truy vấn lambda để trả lại tất cả các phương tiện và phương tiện thầu. Một cái gì đó giống như trong sql:

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

Đây là những gì tôi đã làm:

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

Nhưng tôi nhận được một ngoại lệ:

Thực thể hoặc loại phức tạp 'XXXXXXXX' không thể được xây dựng trong một Truy vấn LINQ to Entities.

Trả lời

9

Bạn không thể xây dựng ánh xạ loại thực thể trong dự báo. Ví dụ trước đây của bạn sẽ chỉ làm việc nếu bạn tạo một loại đặc biệt mới sử dụng cho chiếu:

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 
} 

Và phương pháp của bạn sẽ trông giống như:

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

Bạn không thể tạo các thực thể trong câu lệnh chọn. Hãy thử thay vào đó:

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

Bạn cũng có chắc chắn muốn Union và không phải là Concat?

+0

tôi cần những đối tượng toàn bộ xe. Sự khác biệt giữa Union và Concat là gì? – Naor

+3

'Concat' trả về kết quả đầy đủ của cả hai truy vấn,' Union' loại bỏ các bản sao. – Magnus

-4

Hãy thử điều này ra ...

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

và trả lại theo cách này

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

điều này thậm chí sẽ không biên dịch. làm thế nào để bạn mong đợi để nhanh chóng một giao diện? –