2016-03-23 4 views
0

Контекст: У меня есть решение с 3-х проектамиEntity Framework 6 Проектирования, ПОКО объект возвращаемого типа

Project.Db: Содержит мои DbContext/Хранилище
Project.Core: содержит мои классы POCO (используемых DbContext) ,
Project.Web: Мой проект mvc, который содержит классы отображения viewModels и POCO-ViewModel.

Кажется невозможным, чтобы типизированная проекция возвращала тип объекта EF. В Project.Db У меня есть следующий метод. Я хочу получить два конкретных поля (Имя и идентификатор) регионов и их субрегионов. Я не хочу, чтобы сгенерированный 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>).

Все мои методы репозитория возвращают объекты типа (POCO) в веб-проект.

Есть ли способ сделать это без проецирования на анонимный тип и отобразить его обратно в тип региона (который будет избыточным)? Спасибо

+0

Я не знаю, куда вы хотите поехать, так Я не могу указать вам в правильном направлении. Мне непонятно, зачем вам эти частично заполненные сущности. –

+0

Отредактировано более подробно – BenoitM

+0

Попробуйте следующую технику: http://stackoverflow.com/questions/12916080/the-entity-or-complex-type-cannot-be-constructed-in-a-linq-to-entities-query –

ответ

0

Невозможно напрямую создать экземпляр типа 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(); 
} 

Конечно, это боль в области шеи и получает некрасиво очень быстро с большим количеством таблиц отношений.

1

Возможно. Я просто сделал это с
<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 только выбрать поля, мне нужно из этого автомобиля и vehicleprocess:

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 ...