无法在MongoDB集合上执行AsQueryable操作

8
我有两个模型,一个是用户(User),另一个是团队(Team),如下所示:

    [BsonRepresentation(BsonType.ObjectId)]
    public ObjectId _id { get; set; }
    [Display(Name = "Password:")]
    public string Password { get; set; }
    [Display(Name = "Confirm:")]
    public string ConfirmPassword { get; set; }
    [Display(Name = "Email:")]
    public string Email { get; set; }
    [Display(Name = "Username:")]
    public string UserName { get; set; }
    [Display(Name = "Firtname:")]
    public string Firstname { get; set; }
    [Display(Name = "Lastname:")]
    public string Lastname { get; set; }
    [Display(Name = "Country:")]
    public string Country { get; set; }
    [Display(Name = "City:")]
    public string City { get; set; }
    [Display(Name = "Birthdate:")]
    public int Birthdate { get; set; }
    public List<Team> Teams { get; set; }


   [BsonRepresentation(BsonType.ObjectId)]
    public ObjectId TeamID { get; set; }
    public string TeamName { get; set; }
    public string UserName { get; set; }
    public int LeagueID { get; set; }

    public List<Player> Player { get; set; }

我已经创建了一个用户,但现在我想将团队添加到我的用户中。 这是我正在使用的代码:

  var databaseClient = new MongoClient(Settings.Default.FantasySportsConnectionString);
  var server = databaseClient.GetServer();
  var database = server.GetDatabase("Users");
  var collection = database.GetCollection<User>("users");

  var user = collection.AsQueryable().First(o => o._id == Session["ID"]);

  user.Teams.Add(new Team { TeamID = new ObjectId(), TeamName = "Some Team" });

但是我这样做会出现以下错误:
1:实例参数:无法将MongoDB.Driver.MongoCollection<SportsFantasy_2._0.Models.User>转换为System.Collections.IEnumerable 2:'MongoDB.Driver.MongoCollection<SportsFantasy_2._0.Models.User>'不包含定义为'AsQueryable'的内容,并且最佳的扩展方法重载'System.Linq.Queryable.AsQueryable(System.Collections.IEnumerable)'具有一些无效的参数

"AsQueryable"是针对"IEnumerable<T>"的扩展方法,而不是"MongoCollection",您将不得不创建一个或者可能已经有一个针对Mongo的linq扩展类。 - sa_ddam213
2个回答

11
你缺少一个命名空间:MongoDB.Driver.Linq,只需要在顶部添加即可:
using MongoDB.Driver.Linq;

那个具体的方法是:

LinqExtensionMethods
{
    public static IQueryable<T> AsQueryable<T>(this MongoCollection<T> collection);
    //...
}

我已经添加了,但现在它显示错误: 错误1 运算符“==”不能应用于类型为“MongoDB.Bson.ObjectId”和“object”的操作数在以下行中:var user = collection.AsQueryable().First(o => o._id == Session["ID"]); - Daniel Gustafsson
2
@DanielGustafsson 这是完全不同的问题。确实,_id 是 ObjectID 类型,而 Session["ID"] 是一个对象。如果你确定它实际上是 ObjectID 类型,那么进行强制转换:o._id == (ObjectID)Session["ID"]。 - i3arnon

2

我使用.NET驱动程序v2.3.0时遇到了相同的错误。我通过NuGet删除了它并安装了v2.2.4,这样就可以工作了。我一直收到的错误是: 方法未找到:'MongoDB.Driver.Linq.IMongoQueryable1<!!0> MongoDB.Driver.IMongoCollectionExtensions.AsQueryable(MongoDB.Driver.IMongoCollection1)'。


当我升级到2.3.0时,我遇到了与您相同的错误,但是当我回退到2.2.4时,它又可以正常工作了。也许这是版本2.3.0中的一个bug。 - zhimin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接