2012-04-12 38 views
11

這裏就是我想要做的事:LINQ到實體無法識別方法「的Int32 ToInt32(System.Object的)」的方法,而這種方法不能被翻譯成店表達

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

我轉換爲Int32是因爲當方法返回List<int>時,我無法返回List<int?>

關於如何解決這個簡單問題的任何建議?

+0

我想'Convert'功能將無法使用LINQ工作實體,是有可能,你可以做一個'db.AccountRules。 AsEnumerable()'然後其餘的 – V4Vendetta 2012-04-12 05:28:20

回答

19

取而代之的是:

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

這樣做:

Select(a => a.RoleId.Value) 

的原因是在錯誤描述;當您通過IQueryable執行這些查詢時,選擇器中使用的方法必須是可以轉換爲SQL查詢或函數的東西。在這種情況下,Convert.ToInt32()不是這種方法。對於允許使用nullint字段,使用.NET .Value屬性確實有效。

但請注意,如果您的RoldIdnull,則這不起作用。你會得到一個InvalidOperationException。你可能想返回一組值,而不是是否支持字段爲空:

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

如果有一個,而int.MinValue如果不是這將返回值。

5

使用此: 選擇(A =>(INT)a.RoleId)

+0

這對我有用。 @安德魯·巴伯的答案沒有。感謝muthuvel。 – user2330678 2016-03-04 17:17:03

+0

是的,這一個工作的地方其他人沒有 - 謝謝 – Lyall 2016-08-31 09:00:43

0

嘗試採取從db.Accounts List對象,做的東西。 它適合我。

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

取而代之的是,試試這個..

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(); 
    } 
相關問題