2012-01-17 9 views
6

Ho il seguenteEntity Framework: impossibile creare un valore costante di tipo x. Solo i tipi primitivi sono supportati in questo contesto.

A Modello Ingegnere:

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

riempio il un elenco di ingegneri con i dati corretti:

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

Fin qui tutto bene.

La mia domanda come posso tirare il nome ingegneri alla voce ita di seguito:

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 

        }; 

Ho anche provato

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

l'errore che sto ottenendo è:

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

Quale genere di capire ma non riesco a capire solo per selezionare il nome dell'ingegnere.

Grazie in anticipo

+2

Non è possibile utilizzare il proprio 'elenco' nella query Linq-to-entities. Possono essere utilizzati solo i dati esistenti nel database. Non è possibile combinare arbitrariamente linq-to-objects e linq-to-entities perché EF non sa come tradurlo in SQL. Usa la soluzione alternativa di @ harriyott e compila 'Nome' dopo aver caricato i biglietti dal database. –

risposta

3

si dovrebbe essere in grado di semplificare il primo a:

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

Detto questo, Entity Framework probabilmente non permette di far funzionare che durante l'esecuzione di una chiamata al database. Se è possibile creare una chiave esterna dal ticket all'ingegnere, è possibile selezionarla nello stesso modo in cui si esegue il nome della società del cliente. Se no, allora avrete bisogno di farlo in due va: in primo luogo, eseguire il popolamento selezionare, senza la proprietà name ingegnere, e dopo che, li compila con qualcosa come:

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

Ovviamente avrete bisogno per aggiungere la proprietà EngineerID e selezionarla nel primo passaggio.

+0

Il lavoro di compilazione del nome afterwords, non sta riempiendo bene il nome. – user1153881

+0

È molto difficile testare esattamente cosa accadrà senza il codice e il database effettivi per eseguirlo (quindi perché ho scritto "qualcosa del genere"). Hai provato a impostare un punto di interruzione e ad esaminare cosa si trova in 'ticket' e' engineers'? – harriyott

+0

OK, ho dovuto inviare i risultati a una nuova variabile, quindi eseguire il lavoro – user1153881

Problemi correlati