2013-05-24 17 views
7

İki özelliğin int dizisi olduğu bir DTO'yu yansıtacak bir sorgu yazmaya çalışıyorum. Projeksiyonda ToArray() çağrısı nedeniyle bir hata alıyorum.LINQ to Varlıklar, ToArray'ı tanımıyor

teams = context 
    .Teams 
    .Include("TeamDepartments") 
    .Include("TeamEmployees") 
    .Select(t => new TeamDto 
     { 
      sourceSystemId = t.TeamId, 
      name = t.Name, 
      manager = t.EmployeeIdTeamManager, 
      teamLead = t.EmployeeIdTeamLead, 
      employees = t.TeamEmployees.Select(te => te.EmployeeId).ToArray(), 
      departments = t.TeamDepartments.Select(td => td.DepartmentId).ToArray() 
     }) 
    .ToList(); 

İki int [] özellik olan çalışanlar ve bölümler için bu değerleri nasıl alabilirim? Şimdilik, sadece takım listesini geri çekiyorum ve DTO'yu oluşturmak için onları deviriyorum.

Başka benzer sorular gördüm, ancak çözümler benim için çalışmıyor gibi görünüyor. Yapmam gereken bir adım daha var çünkü bir ilişkiyi geçiyorum.

+1

TeamDto hakkını gönderir misiniz? – Fals

cevap

14

Ne yapmak gerek iki farklı adımlar içine bu sorgu ayrıdır sorgunun dışında Sonra

// you have now something like 
string[] employees; 
// instead do 
IEnumberable<string> employees; 
// If you want an array add 
string[] _employees; 

; ilk doğru sonuçları alacak ve ikincisi verileri DTO'nuza yansıtacaktır. Bunun gibi:

teams = context 
    .Teams 
    .Include("TeamDepartments") 
    .Include("TeamEmployees") 
    .Select(t => new // notice this is an anonymous object 
     { 
      sourceSystemId = t.TeamId, 
      name = t.Name, 
      manager = t.EmployeeIdTeamManager, 
      teamLead = t.EmployeeIdTeamLead, 
      employees = t.TeamEmployees.Select(te => te.EmployeeId), 
      departments = t.TeamDepartments.Select(td => td.DepartmentId) 
     }) 
    .ToList() // first run the query on the server without the ToArray calls 
    .Select(obj => new TeamDto 
     {  // then project the in-memory results onto your DTO. 
      sourceSystemId = obj.sourceSystemId, 
      name = obj.name, 
      manager = obj.manager, 
      teamLead = obj.teamLead, 
      employees = obj.employees.ToArray(), 
      departments = obj.departments.ToArray() 
     }) 
    .ToList(); 
+0

Belki de ilk ToList (İlk sorgu sonucundan bir seçim yapabilirsin, yani IQueryable. – Fals

+3

İlk 'ToList' gereklidir, çünkü sorgunun daha sonra 'ToArray' çağrıları kullanılarak DTO’ya yansıtılan' Seç 'çağrısından önce sunucuda çalışması gerekir, çünkü bu çağrılar SQL'e çevrilemez. –

+0

Anladım! Açıklama için çok teşekkür ederim! – Fals

2

Sorunun, SQL sağlayıcısının bir SQL sorgusuna dönüştürdüğü blok içinde ToArray'u aramaya çalıştığınız olduğuna inanıyorum. Tabii ki, SQL Server, bir dizinin ne işe yaradığına dair bir fikre sahip değildir, böylece yöntem çalışmaz. ToArray aramasını kaldırırsanız ne olur? Bu sonuçların, gerektiğinde dönüştürebileceğiniz blokun dışında IEnumberables olarak geri döneceğine inanıyorum. Bunun işe yaramayacağından emin değilim, ancak TeamDto tanımınızı aşağıdaki şekilde değiştirirseniz, sorunu çözebilir. _employees = employees.ToArray();

+0

Bu, Linq2Sql'nin EF'ye dönüştürülmesinde sık karşılaşılan bir sorundur, çünkü Linq2Sql bunu yapmanıza izin verir (tabiki SQL Server hala ToArray çağrısını yorumlamıyor) –

İlgili konular