好的,在工作中我们正在使用MVC C#和MongoDB开发一个系统.在第一次开发时,我们认为遵循Repository模式可能是一个好主意(屁股中的痛苦!),这里是代码,用于了解当前实现的内容.
MongoRepository类:
public class MongoRepository { }
public class MongoRepository<T> : MongoRepository, IRepository<T>
where T : IEntity
{
private MongoClient _client;
private IMongoDatabase _database;
private IMongoCollection<T> _collection;
public string StoreName {
get {
return typeof(T).Name;
}
}
}
public MongoRepository() {
_client = new MongoClient(ConfigurationManager.AppSettings["MongoDatabaseURL"]);
_database = _client.GetDatabase(ConfigurationManager.AppSettings["MongoDatabaseName"]);
/* misc code here */
Init();
}
public void Init() {
_collection = _database.GetCollection<T>(StoreName);
}
public IQueryable<T> SearchFor() {
return _collection.AsQueryable<T>();
}
}
Run Code Online (Sandbox Code Playgroud)
IRepository接口类:
public interface IRepository { }
public interface …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用IRepository模式(C#,MVC5)创建一个MongoDB Web应用程序,以便更容易进行单元测试.只是想知道是否有人可以告诉我为什么这更快.
这是使用最新的MongoDB c#驱动程序.
在我的IRepository类中,我有以下内容
IQueryable<T> SearchFor();
List<T> SearchFor(FilterDefinition<T> filter);
Run Code Online (Sandbox Code Playgroud)
找到一个SO帖子,建议使用IQueryable来提高使用IEnumerable的速度.
这是MongoRepository类的代码.
public IQueryable<T> SearchFor() {
return _collection.AsQueryable<T>();
}
public List<T> SearchFor(FilterDefinition<T> filter) {
return _collection.Find(filter).ToList();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,过滤器定义是您通常如何将查询编码到数据库.
以下是从数据库获取数据的调用
IQueryable<Client> asd4 = collection.SearchFor().Where(x => x.ClientDesc == "<search text>");
FilterDefinition<Client> filter1 = Builders<Client>.Filter.Eq("ClientDesc", "<search text>");
List<Client> asd10 = collection.SearchFor(filter1).ToList<Client>();
Run Code Online (Sandbox Code Playgroud)
请注意,我知道我应该使用IQueryable和Linq路由只是因为IRepository不应该包含技术相关的classess(如FilterDefinition).
当针对具有30k简单文档的集合进行测试并测试不同方法的速度时,我得到以下结果.
使用IQueryable在3ms内完成,FilterDefinition在43ms内完成.
我想知道为什么对IQueryable的Linq查询比使用API发送请求只是为了返回特定值更快?
更新:根据@lenkan的建议,我为IQueryable的每个循环添加了一个.
public void PerformanceTest(IRepository<Client> collection) {
Stopwatch sw = new Stopwatch();
// Delete all records
// ******************
System.Diagnostics.Debug.WriteLine("*****************");
sw.Start();
collection.DeleteAll();
sw.Stop();
System.Diagnostics.Debug.WriteLine("Deleting all records: " + sw.Elapsed);
// …Run Code Online (Sandbox Code Playgroud)