无法转换类型为'System.Data.Objects.ObjectQuery`1 .....的对象以输入'DatabaseModel1 ......'。 ASP

时间:2012-03-04 16:35:52

标签: asp.net linq entity-framework

您好我正在尝试为任何向我的网站注册的用户分配默认组。由于该组的管理员ID是管理员,因此我在数据库中查询管理员ID为我的管理员的组,然后将该组分配给用户。但是,抛出以下错误 “无法将'System.Data.Objects.ObjectQuery`1 [DatabaseModel1.Group]'类型的对象强制转换为'DatabaseModel1.Group'。” 继承人的代码

        Dim defaultGroup = (From group As Group In context.Groups
                     Where group.AdminID = ((From users As User0 In context.User0
                                            Where users.Name Like "Administrator"
                                            Select users.UserID).First)
                       Select group)

        currentUser.Groups.Add(defaultGroup)//the error is being thrown here

任何帮助将不胜感激 感谢

2 个答案:

答案 0 :(得分:5)

听起来你有一个可以返回多个结果的查询,但是你试图将它分配给单值变量。

你可能只需要使用类似的东西:

currentUser.Groups.Add(defaultGroup.First)

可能的选项是:

  • First() - 允许多个结果并返回第一个结果;如果没有
  • ,将抛出异常
  • FirstOrDefault() - 允许多个结果并返回第一个结果;如果没有结果,将返回元素类型的默认值(例如null
  • Last() - 允许多个结果并返回最后一个;如果没有
  • ,将抛出异常
  • LastOrDefault() - 允许多个结果并返回最后一个;如果没有结果,将返回元素类型的默认值(例如null
  • Single() - 只需要一个结果;如果没有结果或多个结果,则抛出异常

现在您已经显示了查询,听起来您应该使用连接而不是嵌套查询。我对VB查询语法不热,但在C#中你可能想要:

var defaultGroupQuery = 
        from group in context.Groups
        join user in context.User0 on group.AdminID equals user.UserID
        where user.Name == "Administrator"
        select group;

答案 1 :(得分:0)

    List<int> adminIDs = context.User0.Where(u=> u.Name.Contains("Administrator"))
                               .Select(u=>u.UserId);

    //you can use `FirstOrDefault()` above and it will return only int not `List<int>`
    // but i'm showing you how to get all IDs then you can get the first one

    int adminId = adminIDs.FirstOrDefault();

    //and then get only one Group using this adminID
    var defaultGroup = context.Groups.FirstOrDefault(g=>g.AdminID == adminId);
    if(defaultGroup != null)
    {
      currentUser.Groups.Add(defaultGroup);
    }

    //you can use the `List<int> adminIDs` if you need to get all admin groups

var groups = context.Groups.Where(gg => adminIDs.Contains(gg.AdminID));

希望它有所帮助。