Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Mongodb查询的最佳方式_C#_Mongodb - Fatal编程技术网

C# Mongodb查询的最佳方式

C# Mongodb查询的最佳方式,c#,mongodb,C#,Mongodb,Hi开始在c#中使用mongodb,发现它非常酷,只是想知道查询的最佳方式 似乎有以下选项 var query = Query<Entity>.EQ(e => e.Id, id); var entity = collection.FindOne(query); 现在,第二个对我来说更具吸引力,因为我已经习惯了,但是在性能和最佳实践方面,有什么区别和建议吗?您的第一个示例是使用驱动程序本机查询-本质上是通过查询帮助程序等创建查询文档 第二个是使用Linq 在引擎

Hi开始在c#中使用mongodb,发现它非常酷,只是想知道查询的最佳方式

似乎有以下选项

    var query = Query<Entity>.EQ(e => e.Id, id);
    var entity = collection.FindOne(query);

现在,第二个对我来说更具吸引力,因为我已经习惯了,但是在性能和最佳实践方面,有什么区别和建议吗?

您的第一个示例是使用驱动程序本机查询-本质上是通过
查询
帮助程序等创建
查询文档

第二个是使用Linq

在引擎盖下,这两个问题归结为生成相同的查询:

db.entity.find({_id: 'abc123'});
在本例中,结果QueryDocument被序列化为查询

{_id: 'abc123'}
根据报告:

仅支持可转换为等效MongoDB查询的LINQ查询。如果编写无法翻译的LINQ查询,则会出现运行时异常,错误消息将指示查询的哪一部分不受支持

对我来说,这意味着将LINQ查询转换为MongoDB查询会有一些开销


我还没有对此进行测试,但我怀疑使用查询的性能会稍微好一些。第一种方法是构建一个查询,然后使用它来查找结果

第二种方法是直接LINQ查询,对于.NET开发人员来说通常更为熟悉

规范模式为您提供了一个可重用的过滤逻辑。如果您经常需要按照相同的条件筛选集合,尤其是需要将筛选器应用于来自不同存储库的集合,那么它非常有用

下面是一个可能使用它的快速示例(请原谅任何粗略的代码,我已经离开C#有一段时间了):


如果您重新定义了什么是“可用的小部件”,您可以更新规范,让所有消费者的行为都相同。

我没有明确的答案,但您是否尝试过使用System.Diagnostics.Stopwatch来围绕代码进行查询,比如说,进行了一千次?应该给你一些更多的信息。考虑到这是一个数据库操作,往返数据库的时间可能会掩盖你在代码中所做的任何优化。今晚必须尝试一下,我会在这个线程中发布结果
{_id: 'abc123'}
static class WidgetSpecification  {
    function Query<Widget> AvailableWidgets() 
    {
        return new Query<Widget>.EQ(e => 
          e.StartDate <= Date.Today 
          && e.EndDate >= Date.Today 
          && e.Active == true
          && e.InStock == true);
    }
}
{
    ...
    var products = getProductsFromSomewhere();
    var query = WidgetSpecifiation.AvailableWidgets();

    var availableProducts = Products.Find(query);
    ...
}