LINQ to Entities无法识别方法'Int32 ToInt32(System.Object)'方法,并且此方法无法转换为存储表达式

时间:2012-04-12 05:07:29

标签: c# linq casting int

这是我正在尝试做的事情:

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>

关于如何解决这个简单问题的任何建议?

3 个答案:

答案 0 :(得分:22)

而不是:

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

这样做:

Select(a => a.RoleId.Value)

原因在于错误描述;当您通过IQueryable进行这些查询时,选择器中使用的方法必须是可以转换为SQL查询或函数的方法。在这种情况下,Convert.ToInt32()不是这种方法。对于允许int的{​​{1}}字段,使用.NET null属性确实有效。

请注意,如果您的.ValueRoldId,则无效。你会得到null。如果支持字段为空,您可能希望返回设置值:

InvalidOperationException

如果有值,则返回值,如果不存在,则返回Select(a => a.RoleId.HasValue ? a.RoleId.Value : int.MinValue)

答案 1 :(得分:6)

使用此: 选择(a =&gt;(int)a.RoleId)

答案 2 :(得分: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();
    }