2013-08-07 15 views
10

Provo a creare una query di join di linq in nopCommerce 3.0. Mi unisco a due tavolo in linq e scrivereUn'espressione lambda con un corpo di istruzioni non può essere convertita in un albero di espressioni in nopCommerce

il codice con successo. ma lo studio intellicence visual mostra l'errore come

un'espressione lambda con un corpo dichiarazione non può essere convertito in un albero di espressione

, vedere il mio codice qui sotto

var roles = _customerEventRoleRepository.Table.Where(c => c.EventId == selevent) 
        .Join 
        (
         _customerRepository.Table, 
         cev => cev.CustomerId, c => c.Id, 
         (cev, c) => 
         {        
          var cust = new CustomerEventRolesModel(); 

          cust.Id = cev.Id; 
          cust.CustomerId = c.Id; 
          cust.Customer = c.Email; 
          cust.ContactName = c.GetAttribute<string>(SystemCustomerAttributeNames.FirstName); 
          cust.CompanyName = c.GetAttribute<string>(SystemCustomerAttributeNames.Company); 
          cust.Speaker = cev.IsSpeaker; 
          cust.Sponsor = cev.IsSponser; 

          return cust; 
         } 
        ).OrderBy(cev => cev.Customer).ToList(); 

ma l'errore mostra

enter image description here

please help

+4

Il lambda è una funzione. Questa funzione non può essere convertita in SQL. Devi trovare un altro modo per fare ciò che stai facendo. –

+0

Grazie per la tua risposta valutabile. qui ContactName e CompanyName sono necessari nel risultato della query. –

risposta

2

Il messaggio di errore è esattamente quello che dice. Hai un'espressione lambda. Ha un corpo di dichiarazione. Un'espressione lambda con un corpo di istruzione non può essere convertita in un albero di espressioni. Ma Join richiede un albero di espressioni da utilizzare con EF. Dovresti provare a sostituire quello che hai con un'espressione lambda che non ha un corpo come:

(cev, c) => new CustomerEventRolesModel { 
       Id = cev.Id, 
       CustomerId = c.Id 
      } 

E così via.

A proposito,

ContactName = c.GetAttribute<string>(SystemCustomerAttributeNames.FirstName) 

non funziona con EF. Periodo. Faresti meglio a capire qualcos'altro.

+0

Grazie per la tua preziosa risposta. Mi dispiace davvero, signore. Non sono una persona esperta. come posso includere ContactName e CompanyName in questo risultato di query. Penso che sia necessario modificare l'intera funzione per aggiungere i campi ContactName e CompanyName. –

+4

Inserendoli. Mimica cosa ho fatto per le prime due proprietà. – jason

+3

-1; ripetendo il contenuto del messaggio di errore in frasi paternalisticamente brevi e con l'aggiunta di ALL CAPS è improbabile che possa aiutare il richiedente a capire perché il suo codice era illegale. In particolare, questa risposta non spiega cosa sia un albero di espressioni, a cosa EF le utilizza, o perché il compilatore non è in grado di fare (o è disposto a farlo) il riarrangiamento banale che fa andare via l'errore di compilazione (che è estraendo il corpo lambda in un metodo e usando una chiamata a quel metodo come valore di un'espressione lambda senza corpo). –