小编Dwi*_*iea的帖子

使用存储库模式时的MongoDB和大数据集

好的,在工作中我们正在使用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)

linq mongodb mongodb-.net-driver

3
推荐指数
1
解决办法
729
查看次数

MongoDB C#驱动程序:API与Linq性能

我正在尝试使用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)

c# linq mongodb mongodb-.net-driver

2
推荐指数
1
解决办法
3786
查看次数

标签 统计

linq ×2

mongodb ×2

mongodb-.net-driver ×2

c# ×1