联盟实体框架 [英] Union in entity framework

查看:138
本文介绍了联盟实体框架的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个表:车辆和工人。

 车辆(身份证,号码)
工人(ID,姓名,ContractorVehicleNumber)
 

我想写的lambda查询返回所有的车辆和承包车辆。喜欢的东西在SQL:

  SELECT身份证,号码
车用
联盟
SELECT NULL,ContractorVehicleNumber
工人
 

这是我做了什么:

 公开的IQueryable<车>获取(布尔includeContractorVehicles)
{
    IQueryable的<车>查询= GetQuery();

    如果(includeContractorVehicles ==真)
    {
        WorkerRepository代表=新WorkerRepository();
        IQueryable的<车> contractorsVehicles = rep.GetWirkers()。
            选择(X =>新建汽车()
            {
                VehicleNumber = x.ContractorVehicleNumber
            });
        查询= query.Union(contractorsVehicles);
    }

    返回查询;
}
 

不过,我得到一个异常:

  

实体或复杂类型XXXXXXXX'不能在LINQ到实体查询构造。

解决方案

您不能构造投影映射的实体类型。如果您创建用于投影新的特殊类型的前例只会工作:

 公共类VehicleResult
{
    耻骨串号{获得;组; }
    ... //如果你不需要更多然后一栏,你可以使用简单的类型,而不是自定义类
}
 

和你的方法是这样的:

 公开的IQueryable< VehicleResult>获取(布尔includeContractorVehicles)
{
    IQueryable的< VehicleResult> 。查询= GetQuery()选择(V =>新建VehicleResult {...});

    如果(includeContractorVehicles ==真)
    {
        WorkerRepository代表=新WorkerRepository();
        IQueryable的< VehicleResult> contractorsVehicles = rep.GetWorkers()。
            选择(X =>新建VehicleResult()
            {
                数= x.ContractorVehicleNumber
            });
        查询= query.Union(contractorsVehicles);
    }

    返回查询;
}
 

I have two tables: Vehicles and Workers.

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

I would like to write lambda query to return all the vehicles and the contractor vehicles. Something like in sql:

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

This is what I made:

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

But I get an exception:

The entity or complex type 'XXXXXXXX' cannot be constructed in a LINQ to Entities query.

解决方案

You cannot construct mapped entity type in projection. Your former example will work only if you create a new special type used for projection:

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
}

And your method will look like:

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

这篇关于联盟实体框架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆