2012-01-17 17 views
6

Mam następującyEntity Framework - Nie można utworzyć stałej wartości typu x. W tym kontekście obsługiwane są tylko typy pierwotne.

inżynier Model:

public class engineers 
{ 
    public Guid? Guid { get; set; } 
    public string Name { get; set; } 
} 

ja wypełnić listę inżynierów z poprawnymi szczegóły:

List<engineers> listeng = new List<engineers>(); 
listeng.Add(new engineers { Name = profile.FirstName + " " + profile.LastName, Guid = GuidEngineer }); 

tej pory tak dobrze.

Moje pytanie jak mogę pociągnąć nazwę inżynierów wejściem pol poniżej:

var tickets = from o in new HelpdeskEntities().Tickets.Where(t => t.TicketState.State == "Open") 
        select new AjaxTickets 
        { 
         TicketID = o.TicketID, 
         TicketSubject = o.TicketSubject, 
         ClientCompanyName = o.ClientCompany.ClientCompanyName, 
         DateOpened = o.DateOpened, 
         **eng** = list.Where(x => x.Guid == o.EngineerID).Select(x => new engineers {Guid = x.Guid, Name=x.Name }).FirstOrDefault().Name 

        }; 

Ja również próbował

var tickets = from o in new HelpdeskEntities().Tickets.Where(t => t.TicketState.State == "Open") 
        select new AjaxTickets 
        { 
         TicketID = o.TicketID, 
         TicketSubject = o.TicketSubject, 
         ClientCompanyName = o.ClientCompany.ClientCompanyName, 
         DateOpened = o.DateOpened, 
         **eng** = list.Where(x => x.Guid == o.EngineerID).Select(x => x.Name }).FirstOrDefault() 
        }; 

Błąd Dostaję jest:

Unable to create a constant value of type 'Helpdesk2.ViewModel.engineers'. Only primitive types ('such as Int32, String, and Guid') are supported in this context."} 

Co trochę rozumiem, ale nie mogę wymyślić, po prostu wybrać nazwę inżyniera.

góry dzięki

+2

Nie możesz użyć swojej 'listy' w zapytaniu Linq do encji. Można wykorzystywać tylko dane istniejące w bazie danych. Nie możesz dowolnie łączyć linq-to-objects i linq-to-entity, ponieważ EF nie wie, jak przetłumaczyć go na SQL. Użyj obejścia @ harriyott i zapełnij 'Name' po załadowaniu biletów z bazy danych. –

Odpowiedz

3

powinny mieć możliwość uproszczenia jako pierwsza:

list.FirstOrDefault(x => x.Guid == o.EngineerID).Name 

Mimo, że Entity Framework prawdopodobnie nie pozwoli Ci uruchomić, że po uruchomieniu połączenia z bazą danych. Jeśli możesz zrobić klucz obcy z biletu do inżyniera, możesz go wybrać w taki sam sposób, jak robisz nazwę firmy klienta. Jeśli nie, to trzeba to zrobić w dwóch idzie: najpierw uruchom select bez wypełniania właściwość name inżynier, a po tym, wypełnić je z czymś takim:

tickets.ForEach(ticket => ticket.EngineerName = engineers.First(eng => eng.Guid == ticket.EngineerID).Name) 

Oczywiście będziesz potrzebować aby dodać właściwość EngineerID i wybrać ją w pierwszym kroku.

+0

Praca nad wypełnianiem nazwisk nie jest dobrze wypełniana. – user1153881

+0

Bardzo trudno jest dokładnie przetestować, co się stanie, bez rzeczywistego kodu i bazy danych, aby go uruchomić (stąd dlaczego napisałem "coś w stylu"). Czy próbowałeś ustawić punkt przerwania i sprawdzić, co jest w "biletach" i "inżynierach"? – harriyott

+0

OK, musiałem wysłać wyniki do nowej zmiennej, a następnie wykonać pracę – user1153881

Powiązane problemy