2012-04-12 11 views
11

hier übersetzt ist, was ich versuche zu tun:LINQ to Entities nicht die Methode ‚Int32 ToInt32 (System.Object)‘ Methode erkennen, und diese Methode kann nicht in einen Laden Ausdruck

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

Ich hatte in Int32 zu konvertieren, da ich eine List<int?> nicht zurückgeben konnte, wenn die Methode List<int> zurückgeben sollte.

Irgendwelche Vorschläge zur Lösung dieses einfachen Problems?

+0

Ich denke, die 'Convert' Funktionen nicht mit LINQ to Entities arbeiten, ist es möglich, dass Sie ein' db.AccountRules tun könnte. AsEnumerable() 'und dann der Rest – V4Vendetta

Antwort

19

Statt dessen:

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

tun:

Select(a => a.RoleId.Value) 

Der Grund dafür ist in der Fehlerbeschreibung; Wenn Sie diese Abfragen über IQueryable ausführen, müssen die im Selektor verwendeten Methoden etwas sein, das in eine SQL-Abfrage oder -Funktion übersetzt werden kann. In diesem Fall ist Convert.ToInt32() keine solche Methode. Für int Felder mit null zulässig, mit der .NET .Value Eigenschaft funktioniert, obwohl.

Beachten Sie, dass dies nicht funktionieren würde, wenn Ihr RoldIdnull ist jedoch. Sie erhalten eine InvalidOperationException. Vielleicht möchten Sie einen Sollwert zurückzukehren, statt, wenn das dahinter liegende Feld null ist:

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

Dies wird den Wert zurück, wenn es eine gibt, und int.MinValue, wenn nicht.

5

verwenden: Select (a => (int) a.RoleId)

+0

Das funktionierte für mich. @ AndrewBarbers Antwort nicht. Danke Muthuvel. – user2330678

+0

Yep das hat funktioniert wo die anderen nicht - danke – Lyall

0

Try List-Objekt von den db.Accounts zu nehmen und die Dinge zu tun. Es funktioniert für mich.

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

Statt dessen, versuchen Sie dies ..

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