2012-04-12 26 views
11

Dưới đây là những gì tôi đang cố gắng để làm:LINQ to Entities không nhận ra phương pháp 'Int32 ToInt32 (System.Object)' phương pháp, và phương pháp này không thể được dịch sang một biểu hiện cửa hàng

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

tôi đã để chuyển đổi sang Int32 vì tôi không thể trả về List<int?> khi phương thức trả về một số List<int>.

Bất kỳ đề xuất nào về cách giải quyết vấn đề đơn giản này?

+0

Tôi nghĩ rằng 'chức năng Convert' sẽ không làm việc với LINQ to Entities, là nó có thể rằng bạn có thể làm một' db.AccountRules. AsEnumerable() 'và sau đó phần còn lại – V4Vendetta

Trả lời

19

Thay vì điều này:

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

Làm điều này:

Select(a => a.RoleId.Value) 

Lý do là trong các mô tả lỗi; khi bạn đang thực hiện các truy vấn này thông qua IQueryable, các phương thức được sử dụng trong bộ chọn phải là một thứ có thể được dịch sang một truy vấn hoặc hàm SQL. Trong trường hợp này Convert.ToInt32() không phải là một phương pháp như vậy. Đối với các trường intnull được cho phép, sử dụng thuộc tính .NET .Value không hoạt động.

Lưu ý rằng điều này sẽ không hoạt động nếu RoldId của bạn là null, tuy nhiên. Bạn sẽ nhận được InvalidOperationException. Bạn có thể muốn trả về một giá trị đặt thay vì nếu trường ủng hộ là null:

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

này sẽ trả về giá trị nếu có một, và int.MinValue nếu không muốn nói.

5

Sử dụng này: Chọn (a => (int) a.RoleId)

+0

Điều này làm việc cho tôi. @ AndrewBarber của câu trả lời không. Cảm ơn muthuvel. – user2330678

+0

Yep cái này làm việc ở nơi những người khác không - cảm ơn – Lyall

0

Cố gắng đưa Danh sách đối tượng từ db.Accounts và làm những thứ. Nó phù hợp với tôi.

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

Thay vì điều này, hãy thử này ..

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(); 
    } 
Các vấn đề liên quan