我正在尝试连接到MongoDB并使用LINQ搜索集合。我用nuget安装了所有的mongo工具,得到一个错误,说getcollection返回i mongocollection,但是asqueryable需要一个mongocollection。我知道我可以在这里解决这个问题,我想我可能做错了什么。这是我的代码:
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Threading.Tasks;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using MongoDB.Bson;
namespace Services.Data.Repositories.Concrete
{
public class AccountRepository : IRepository<Account>
{
private IMongoDatabase _database;
private IMongoClient _client;
public AccountRepository()
{
var connectionString = ConfigurationManager.ConnectionStrings["MongoDB"].ConnectionString;
_client = new MongoClient(connectionString);
_database = _client.GetDatabase("test");
}
public async Task<Account> GetAsync(string id)
{
var accounts = _database.GetCollection<Account>("accounts");
var account = await accounts.Find(f => f.Id == id).FirstAsync();
return account;
}
public async Task<List<Account>> GetAllAsync(bool onlyActive)
{
var accounts = _database.GetCollection<Account>("accounts");
return accounts.AsQueryable<Account>().ToList();
}
如果你看看getallasync方法,这就是我得到编译错误的地方。我在这里做错什么了吗?
例外情况:
错误5实例参数:无法从“mongodb.driver.imongocollection”转换为“mongodb.driver.mongocollection”
更新
我检查过了,在imongocollection接口上没有findall方法。我可以用下面的代码暂时解决我的问题,但这显然不是最好的方法。是我遗漏了什么,还是这个标准实现了?
public async Task<List<Account>> GetAllAsync(bool onlyActive)
{
var accounts = _database.GetCollection<Account>("accounts") as MongoCollection;
return accounts.AsQueryable<Account>().ToList();
}
最佳答案
您可以看到asqueryable的定义:
public static IQueryable<T> AsQueryable<T>(this MongoCollection<T> collection);
public static IQueryable<T> AsQueryable<T>(this MongoCollection collection);.
参数是MongoCollection…
你可以改变
return accounts.AsQueryable<Account>().ToList();
到
return accounts.FindAll();