将IQueryable转换为string []时遇到NotSupportedException

时间:2012-02-11 10:21:37

标签: asp.net-mvc-3 entity-framework-4 entity-framework-4.1 type-conversion

我遇到了IQueryable到string []转换的问题。

 public string[] GetRolesForUser(User user)
    {
        if (!UserExists(user))
            throw new ArgumentException(MissingUser);

        var qry = from x in entities.Roles
               where x.Users.Contains(user)
               select x.RoleName;

        return qry.ToArray(); // At this point I've got a NotSupportedException
    }

异常消息:

  

无法创建“SchoolMS.Models.Entities.User”类型的常量值。在此上下文中仅支持原始类型(例如Int32,String和Guid')。

请帮助,我该如何解决这个问题?什么是正确的方法?

(我正在使用带有mvc3的EF 4.1)

3 个答案:

答案 0 :(得分:1)

我怀疑问题是实体框架无法为查询中的user变量创建常量。一种解决方案可能是手动创建连接而不是使用Contains

var qry =   from x in entities.Roles
            join Users u on u.RoleId = x.Id
            where u.Id = user.Id
            select x.RoleName

答案 1 :(得分:0)

我会考虑写

var qry = from x in entities.Roles
  where x.Users.Select(u => u.Id).Contains(user.Id)
  select x.RoleName;

因此,根据要求,它将是一种原始类型。

答案 2 :(得分:0)

问题解决了。

我在我的用户和角色(UsersInRoles表提供它)之间使用了多对多的关系,这就是为什么我的查询不适合这个

我在我的方法中更改了查询,它工作正常..

public string[] GetRolesForUser(User user)
{
    if (!UserExists(user))
        throw new ArgumentException(MissingUser);

    var qry = entities.Users
        .Where(u => u.UserID == user.UserID)
        .SelectMany(x => x.Roles.Select(r => r.RoleName));

    return qry.ToArray();
}