簡體   English   中英

實體框架6投影,POCO實體返回類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM