如何通过比较子字段来构造MongoDB Linq Any()查询
我正在尝试构造以下嵌套查询,以便它可以在我的C#实体上运行,但可以通过C#驱动程序正确地转换为MongoDB查询如何通过比较子字段来构造MongoDB Linq Any()查询,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我正在尝试构造以下嵌套查询,以便它可以在我的C#实体上运行,但可以通过C#驱动程序正确地转换为MongoDB查询 lpn = new List<PN> { new PN("/standard"), new PN("/my") };n Collection.AsQueryable<T> (o => o.pns.Any(pf => lpn.Any(pn => pn.n == pf.n)) 我很感激,因为它试图将一个$in:[]查询放入另一个查询中
lpn = new List<PN> { new PN("/standard"), new PN("/my") };n
Collection.AsQueryable<T>
(o => o.pns.Any(pf => lpn.Any(pn => pn.n == pf.n))
我很感激,因为它试图将一个$in:[]
查询放入另一个查询中
这就是集合中的对象的外观
{
"_id" : ObjectId("50a5633292c3d22270ac2256"),
"pns" : [
{
"n" : "/standard",
"ns" : {
"v" : "standard"
}
}
]
}
所以pns
是一个PN
类型的数组,所以我不能简单地使用Contains()
,因为我不想匹配整个PN
结构,只匹配n
字段。我尝试过其他各种构造
这是我在贝壳里能想到的最接近的东西
db.collection.find({
"pns": {
"$elemMatch": {
"n": "/standard",
}
}
}).count();
但我甚至找不到一种方法将其转换为Linq表达式
问题
是否可以构建一个linq查询来匹配pns
中lpn
的任何数组成员,但只匹配n
字段?还是我必须手工构建这些查询
更新
我想我差不多有了。我想我需要先转换成一个字符串数组,然后才能对查询进行任何合理的操作,而我认为在Linq中无法做到这一点。所以这是可行的
var strArray = new[] { "/standard", "/my" };
Collection.AsQueryable<T>(o => o.pns.Any(pn => pn.n.In(strArray)));
但不幸的是,司机不够聪明,无法接受这一点
Collection.AsQueryable<T>(o => o.pns.Any(pn => pn.n.In(lpn.Select(pfn => pfn.n))));
Collection.AsQueryable(o=>o.pns.Any(pn=>pn.n.In(lpn.Select(pfn=>pfn.n)));
您需要使用Contains linq方法
var strArray = new[] { "/standard", "/my" };
Collection.AsQueryable<T>(o => o.pns.Any(pn => strArray.Contains(pn.n)));
var strArray=new[]{”/standard“,“/my”};
AsQueryable(o=>o.pns.Any(pn=>strArray.Contains(pn.n));
注意,在您的案例中,您也可以使用
列表来执行此操作。任何实现IEnumerable
…这一点的东西都未经测试。。。如果没有,请告诉我,我会在回家后再做。太好了,谢谢。它生成的json查询与我的In()版本完全相同。这让我想知道-你为什么建议Contains()和In()?我认为这里的关键是认识到我需要将查询值拆分成一个字符串数组。我一直在尝试使用对象数组(列表)构建查询。如果有一种方法可以在不首先构建字符串数组的情况下进行内联操作,那么它就完全避开了我。您也可以对对象进行内联操作。但是,使用这些对象将比较整个对象,而不仅仅是字符串值。我建议包含,因为它是一个内置的Linq方法,而不是LingToMongo方法。因此,一个将您连接到MongoDB,而另一个不连接到MongoDB。是的,对象查询很简单。我是从这里开始的,但是有一个完整的原因清单,为什么我不想用这个比较。可选的DisplayName属性只有一个。您对$in数组的转换是对原始Any(Any)查询到shell的正确转换。我们可能在linq提供程序中识别出类似的内容,但这将很困难。
Collection.AsQueryable<T>(o => o.pns.Any(pn => pn.n.In(lpn.Select(pfn => pfn.n))));
var strArray = new[] { "/standard", "/my" };
Collection.AsQueryable<T>(o => o.pns.Any(pn => strArray.Contains(pn.n)));