实体框架中的联盟

Nao*_*aor 16 .net c# linq-to-entities entity-framework

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

Vehicle(Id, Number)
Workers(Id, Name, ContractorVehicleNumber)
Run Code Online (Sandbox Code Playgroud)

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

SELECT Id, Number
FROM Vehicle
UNION
SELECT NULL, ContractorVehicleNumber
FROM Workers
Run Code Online (Sandbox Code Playgroud)

这就是我所做的:

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;
}  
Run Code Online (Sandbox Code Playgroud)

但我得到一个例外:

无法在LINQ to Entities查询中构造实体或复杂类型"XXXXXXXX".

Lad*_*nka 15

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

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
}
Run Code Online (Sandbox Code Playgroud)

你的方法看起来像:

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;
}  
Run Code Online (Sandbox Code Playgroud)


Mag*_*nus 5

您无法在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;
} 
Run Code Online (Sandbox Code Playgroud)

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

  • `Concat`返回两个查询的完整结果,`Union`删除重复项. (5认同)