可视化MongoDB C#Linq查询驱动程序版本2.4

时间:2017-09-06 20:21:37

标签: c# mongodb linq

我正在使用2.4版本的C#Mongo Driver。我发现了很多关于如何可视化(或解释)以前版本或传统C#Mongo驱动程序支持的查询的流量。我没有运气了解如何在我的版本2.4 Linq后面看到本机Mongo查询。 在我的具体情况下,我使用PredicateBuilder来构建一个复杂的表达式,然后我将其传递到这样的集合中:

var s = collection.AsQueryable().Where(filter.Compile());

之后我可以根据需要通过添加skip,take等来进一步细化查询。最后,我可以调用.ToArray()并执行查询。

我试图在我的Mongod实例上启用“--profile 2 --slowms 15”,并且我已经使用db.getProfilingLevel()验证了配置文件级别为2。通过RoboMongo运行adhoc查询时,甚至在使用c#Mongo 2.4驱动程序中的collection.find方法时,我都可以清楚地看到已记录的查询。

但是,当我在Linq查询上调用.ToArray时,我无法通过我知道的日志记录方法或者c#驱动程序本身的某些方面找到发送给Mongo的查询。

如果我改造我的代码以使用BsonDocuments和构建器对象,我可以看到查询 - 但我宁愿使用Linq。

在使用Linq和Mongo 2.4 C#驱动程序时,是否可以帮助我查看发送给Mongo的基础查询?

相关网址: http://mongodb.github.io/mongo-csharp-driver/2.4/reference/driver/crud/linq/ http://mongodb.github.io/mongo-csharp-driver/2.4/reference/driver/crud/reading/#aggregation

通知“阅读”部分'有一个注释说明您可以在管道上调用ToString以查看将发送到服务器的内容。我可以在使用BsonDocuments / Builder方法创建查询时访问管道,但在使用Linq方法时则不能。

更新:这似乎与filter.compile有关。如果我不使用它,我可以使用.ToString()来查看查询!

var sfilter = PredicateBuilder.True<MediaItem>();
var sTest = collection.AsQueryable().Where(sfilter.Compile()).Where(f => f.MediaItemType == MediaItemTypes.Image);
var sString = sTest.ToString();
// System.Linq.Enumerable+WhereEnumerableIterator'1[Common.Domain.MediaItem]

var xTest = collection.AsQueryable().Where(f => f.MediaItemType == MediaItemTypes.Image);
var xString = xTest.ToString();
// aggregate([{ "$match" : { "MediaItemType" : 1 } }])

PredicateBuilder.True的定义:

public static Expression<Func<T, bool>> True<T>()
{
    return f => true;
}

1 个答案:

答案 0 :(得分:1)

好的,所以在阅读完更新后我相信我可能找到了解决问题的方法。 Mongo对谓词的编译版本没有重载,它返回Func<MediaItem, bool>,但是[Expression<Func<MediaItem, bool>>的重载是预期的。

所以下面的代码应该适合你。

var sfilter = PredicateBuilder.True<MediaItem>();
var sTest = collection.AsQueryable().Where(sfilter).Where(f => f.MediaItemType == MediaItemTypes.Image);
var sString = sTest.ToString();