2012-04-12 15 views
11

Esto es lo que estoy tratando de hacer:LINQ a Entidades no reconoce el método de método 'Int32 ToInt32 (System.Object)', y este método no se puede traducir en una expresión tienda

public List<int> GetRolesForAccountByEmail(string email) 
{ 
    var account = db.Accounts.SingleOrDefault(a => a.Email == email); 
    if (account == null) return new List<int>(); 

    return db.AccountRoles.Where(a => a.AccountId == account.AccountId).Select(a => Convert.ToInt32(a.RoleId)).ToList(); 
} 

que tenía para convertir a Int32 porque no pude devolver un List<int?> cuando el método debía devolver un List<int>.

¿Alguna duda sobre cómo solucionar este problema simple?

+0

'Creo que las funciones Convert' no funcionarán con LINQ a Entidades, es posible que usted podría hacer un' db.AccountRules. AsEnumerable() 'y luego el resto – V4Vendetta

Respuesta

19

lugar de esto:

Select(a => Convert.ToInt32(a.RoleId)) 

hacer esto:

Select(a => a.RoleId.Value) 

La razón está en la descripción del error; cuando realiza estas consultas a través de IQueryable, los métodos que se utilizan dentro del selector deben ser algo que pueda traducirse a una consulta o función SQL. En este caso, Convert.ToInt32() no es un método de este tipo. Para int campos con null permitidos, usando la propiedad .NET .Value funciona, sin embargo.

Tenga en cuenta que esto no funcionaría si su RoldId es , sin embargo. Obtendrás un InvalidOperationException. Es posible que desee devolver un valor de ajuste en su lugar si el campo es nulo respaldo:

Select(a => a.RoleId.HasValue ? a.RoleId.Value : int.MinValue) 

Esto devolverá el valor si es que existe, y si no int.MinValue.

5

Utilice esta: Select (a => (int) a.RoleId)

+0

Esto funcionó para mí. La respuesta de @ AndrewBarber no. Gracias muthuvel. – user2330678

+0

Sí, este trabajó donde los demás no - gracias – Lyall

0

tratar de tomar objeto Lista de los db.Accounts y hacer las cosas. Funciona para mí.

public List<int> GetRolesForAccountByEmail(string email) 
{ 
    var account = db.Accounts.SingleOrDefault(a => a.Email == email); 
    if (account == null) return new List<int>(); 
    return db.AccountRoles.Where(a => a.AccountId == account.AccountId).Select(a => Convert.ToInt32(a.RoleId)).ToList(); 
} 

En lugar de esto, intento esto ..

public List<int> GetRolesForAccountByEmail(string email) 
    { 
    var account = db.Accounts.SingleOrDefault(a => a.Email == email); 
    if (account == null) return new List<int>(); 
    List<AccountRoles> accountRoles= db.AccountRoles.ToList<AccountRoles>(); 
    return accountRoles.Where(a => a.AccountId == account.AccountId).Select(a => Convert.ToInt32(a.RoleId)).ToList(); 
    } 
Cuestiones relacionadas