2010-03-17 8 views
6

Perchè non mi fare questo:Perché LINQ to Entities non riconosce determinati metodi?

usuariosEntities usersDB = new usuariosEntities();  
foreach (DataGridViewRow user in dgvUsuarios.Rows) 
{ 
    var rowtoupdate = 
     usersDB.usuarios.Where(
     u => u.codigo_usuario == Convert.ToInt32(user.Cells[0].Value) 
     ).First(); 
    rowtoupdate.password = user.Cells[3].Value.ToString(); 
} 
usersDB.SaveChanges(); 

E hanno a che fare questo:

usuariosEntities usersDB = new usuariosEntities();  
foreach (DataGridViewRow user in dgvUsuarios.Rows) 
{ 
    int usercode = Convert.ToInt32(user.Cells[0].Value); 
    var rowtoupdate = 
     usersDB.usuarios.Where(u => u.codigo_usuario == usercode).First(); 
    rowtoupdate.password = user.Cells[3].Value.ToString(); 
} 
usersDB.SaveChanges(); 

devo ammettere che è un codice più leggibile, ma il motivo per cui non posso fare questo?

risposta

9

La cosa a questo proposito è che le query LINQ si trasformano da il compilatore in un albero di espressioni. Questo albero di espressioni viene quindi convertito in T-SQL e passato al server. LINQ to SQL associa determinati metodi come String.Contain agli equivalenti T-SQL.

Nel primo esempio, LINQ a quanto pare non esegue il mapping di Convert.ToInt32 su qualsiasi cosa e viene generata l'eccezione. Il motivo per cui funziona nel secondo esempio è perché la chiamata Convert.ToInt32 viene eseguita all'esterno della della query, in modo che non faccia parte dell'albero delle espressioni e non debba essere convertita in T-SQL.

This MSDN page descrive come LINQ to SQL traduce in T-SQL vari tipi di dati, operatori e metodi. (Anche se la documentazione suggerisce che Convert.ToInt32 è supportato quindi non sono sicuro di cos'altro potrebbe succedere qui.)

Scusa appena realizzato questo è ADO.NET Entity Framework, non LINQ to SQL. This page lists i mapping ADO.NET Entity Framework. È un po 'più restrittivo, soprattutto perché ha bisogno di lavorare con più provider.

+1

C'è un modo per rendere L2E mappare questi metodi/funzioni alle funzioni T-SQL? +1 spiegazione chiara – Luiscencio

+0

No, ma se si crea una funzione definita dall'utente in SQL e la si aggiunge al contesto dati, è possibile utilizzarli nelle query. – Josh

+0

quindi se sto usando mysql e aggiungo qualche stored procedure al mio DB, posso chiamarlo in qualche modo? – Luiscencio

0

Perché il tuo LINQ a Ent. non compila la query in MSIL con tutti i metadati, ma semplicemente converte la query in alcuni metodi di estorsione ed è limitata alle parassiti di lambda parsing del langue. Ciò significa che

questo codice:
var results = from c in SomeCollection where c.SomeProperty < someValue * 2 select new {c.SomeProperty, c.OtherProperty};

è lo stesso di questo:

var results = SomeCollection
.Where(c => c.SomeProperty < someValue * 2)
.Select(c => new {c.SomeProperty, c.OtherProperty});

Problemi correlati