[英]Entity Framework 6 Projection, POCO entity return type
上下文:我有3个项目的解决方案
Project.Db:包含我的dbContext /存储库
Project.Core:包含我的POCO类(由dbContext使用)。
Project.Web:我的mvc项目,其中包含viewModels和POCO-ViewModel映射类。
似乎没有类型化的投影返回EF实体类型是不可能的。 在Project.Db中,我有以下方法。 我想获取区域及其子区域的两个特定字段(名称和ID)。 我不希望生成的T-SQL选择不需要的字段。
public List<Region> GetRegionsAndSubRegions(){
var regions = Context.Regions.Where(r => condition);
var lightRegions = regions.Select(z => new Region{
RegionName = z.RegionName,
RegionId = z.RegionId
}).ToList();
}
这会让我出错
The entity or complex type 'Region' cannot be constructed in a LINQ to Entities query.
我发现解决这个问题的方法是:
var lightRegions = regions.ToList().Select(z => new Region{
RegionName = z.RegionName,
RegionId = z.RegionId
}).ToList();
但是,“ ToList()”将选择所有我不需要的字段。
我可以投影到ViewModel类,但是我不希望在Project.Db中具有这种依赖关系。 该方法应返回我的POCO实体的列表(列表<Region
>)。
我所有的存储库方法都将Core(POCO)类型的对象返回到Web项目。
有没有一种方法可以在不投影到匿名类型的情况下将其映射回Region类型(这将是多余的)? 谢谢
这是可能的。 我只是用
<package id="EntityFramework" version="6.1.3" targetFramework="net461" />
车辆(模型和数据库中的30多个字段)被投影到StatisticsVehicle。
我的查询:
var vehicles =
_context.Vehicles
.Select(v =>
new StatisticsVehicle()
{
PlateNumber = v.PlateNumber,
StatisticsVehicleProcesses =
v.VehicleProcesses.Select(vp => new StatisticsVehicleProcess()
{
EffectiveIssuanceDate = vp.EffectiveIssuanceDate,
PlannedIntakeEndDate = vp.PlannedIntakeEndDate
})
}
)
.ToList();
这导致SQL查询仅从该车辆和车辆过程中选择我需要的字段:
SELECT
[Project2].[Id] AS [Id],
[Project2].[C1] AS [C1],
[Project2].[PlateNumber] AS [PlateNumber],
[Project2].[C2] AS [C2],
[Project2].[EffectiveIssuanceDate] AS [EffectiveIssuanceDate],
[Project2].[PlannedIntakeEndDate] AS [PlannedIntakeEndDate]
FROM ...
无法在投影中直接实例化EF实体类型。 我认为这是为了防止歧义,如格特所说。 唯一的方法是投影到匿名类型,然后映射到实体类型。
public List<Region> GetRegionsAndSubRegions(){
var regions = Context.Regions.Where(r => condition);
var anonRegions = regions.Select(r => new {
RegionName = r.RegionName,
RegionId = r.RegionId
}).ToList();
var lightRegions = anonRegions.Select(r => new Region{
RegionName = r.RegionName,
RegionId = r.RegionId
}).ToList();
}
当然,这是一个令人头疼的问题,并且由于与许多表之间的关系而变得非常丑陋。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.