2016-03-23 18 views
0

Bağlam: Ben 3 projelerdeVarlık Framework 6 Projeksiyon POCO varlık dönüş tipi

ile bir çözüm var Project.Db

: (DBContext tarafından kullanılır) benim POCO sınıfları içerir: my DBContext/Repositories
Project.Core İçeriyor .
Project.Web: viewModels ve POCO-ViewModel eşleme sınıflarını içeren mvc projem. Yazılı bir projeksiyonun bir EF varlık türüne sahip olması imkansız gibi görünüyor. Project.Db'de aşağıdaki yönteme sahibim. Bölgelerin ve alt bölgelerinin iki özel alanını (Name ve ID) almak istiyorum. Oluşturulan T-SQL'in istenmeyen alanları seçmesini istemiyorum. Bu bana hata

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

Etrafa almak bulundu yolu alacak

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

şudur:

Ancak
var lightRegions = regions.ToList().Select(z => new Region{ 
             RegionName = z.RegionName, 
             RegionId = z.RegionId 
            }).ToList(); 

, "ToList()" tüm alanları seçecektir Ben istemiyorum.

Bir ViewModel sınıfına proje yapabilirim, ancak Project.Db'de bu bağımlılığı istemiyorum. Yöntem benim POCO varlığımın bir listesini döndürmelidir (Liste <Region>).

Tüm depo yöntemlerim, Web projesine Çekirdek (POCO) yazılan nesneleri döndürür.

Anonim bir türe yansıtmadan ve bunu Bölge türüne (gereksiz olan) eşlemeksizin yapmanın bir yolu var mı? Teşekkürler

+0

, o yüzden bilmiyorum Seni doğru yönde gösteremem. Bu kısmen doldurulmuş varlıklara neden ihtiyacın olduğu açık değil. –

+0

Daha fazla detay ile düzenleme – BenoitM

+0

Bu tekniği deneyin: http://stackoverflow.com/questions/12916080/the-entity-or-complex-type-cannot-be-constructed-in-a-linq-to-entities-query –

cevap

0

Projeksiyonda bir EF Entity türünü doğrudan başlatmak mümkün değildir. Gert'in belirttiği gibi belirsizliği önlemek olduğunu düşünüyorum. Bunu yapmanın tek yolu, anonim bir tür için proje ve sonra varlık türü için eşlemektir. Tabii

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

bu baş belası olan ve masa ilişkileri bir sürü çirkin gerçek hızlı olur.

1

Bu mümkün. Sadece StatisticsVehicle öngörülen
<package id="EntityFramework" version="6.1.3" targetFramework="net461" />

A Araç (model & db 30+ alanlar) 'dir ile yaptım.

Benim Sorgu:

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(); 

sadece ben araç ve vehicleprocess ihtiyacınız alanları seçerek bir sql sorgusu ile sonuçlanır: Eğer gitmek istediğiniz yere

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