2010-03-17 12 views
6

Por qué no puedo hacer esto:¿Por qué LINQ to Entities no reconoce ciertos métodos?

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

Y tener que hacer esto:

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

debo admitir que es un código más legible pero ¿por qué no puede hacerse esto?

Respuesta

9

Lo que pasa es que las consultas LINQ son transformados por el compilador en un árbol de expresiones. Este árbol de expresiones se convierte en T-SQL y se pasa al servidor. LINQ to SQL mapea ciertos métodos como String. Contiene los equivalentes de T-SQL.

En el primer ejemplo, aparentemente LINQ no correlaciona Convert.ToInt32 con nada y se lanza la excepción. La razón por la que funciona en su segundo ejemplo es porque la llamada Convert.ToInt32 se hace fuera de de la consulta, por lo que no forma parte del árbol de expresiones y no necesita convertirse a T-SQL.

This MSDN page describe cómo LINQ to SQL traduce varios tipos de datos, operadores y métodos en T-SQL. (Aunque la documentación sugiere que Convert.ToInt32 es compatible, por lo que no estoy seguro de qué más podría estar pasando aquí.)

Lo sentimos acaba de ser esto ADO.NET Entity Framework, no LINQ to SQL. This page lists las asignaciones de ADO.NET Entity Framework. Es un poco más restrictivo, principalmente porque necesita trabajar con múltiples proveedores.

+1

¿Hay alguna manera de hacer que L2E asigne estos métodos/funciones a las funciones de T-SQL? +1 explicación clara – Luiscencio

+0

No, pero si crea una función definida por el usuario en SQL y la agrega a su contexto de datos, puede usarlas en sus consultas. – Josh

+0

entonces, si estoy usando mysql y agrego algún procedimiento almacenado a mi base de datos, ¿puedo llamarlo de alguna manera? – Luiscencio

0

Porque su LINQ to Ent. no compila la consulta en MSIL con todos los metadatos, sino que simplemente traduce la consulta en unos pocos métodos de extracción y está limitada a lambda analizando las capacidades del lenguaje. Eso significa que

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

es lo mismo que esto:

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

Cuestiones relacionadas