gpt4 book ai didi

mongodb - 如何通过比较子字段构造 MongoDB Linq Any() 查询

转载 作者:可可西里 更新时间:2023-11-01 10:33:55 24 4
gpt4 key购买 nike

我正在尝试构建以下嵌套查询,以便它将在我的 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))

所以这是有效的 C#。我正在尝试将值数组与值数组进行匹配,但我在驱动程序堆栈中遇到此错误;

Result Message: 
Test method MyLib.Tests.Models.ProjectTest.DBImportExcelProject threw exception:
System.NotSupportedException: Unable to determine the serialization information for the expression: System.Collections.Generic.List`1[MyLib.DomainModels.lpn].
Result StackTrace:
at MongoDB.Driver.Linq.Utils.BsonSerializationInfoFinder.GetSerializationInfo(Expression node, Dictionary`2 serializationInfoCache) in d:\vs11Projects\ThirdParty\mongo-csharp-driver\Driver\Linq\Utils\BsonSerializationInfoFinder.cs:line 64
at MongoDB.Driver.Linq.Utils.BsonSerializationInfoHelper.GetSerializationInfo(Expression node) in d:\vs11Projects\ThirdParty\mongo-csharp-driver\Driver\Linq\Utils\BsonSerializationInfoHelper.cs:line 48
at MongoDB.Driver.Linq.PredicateTranslator.BuildAnyQuery(MethodCallExpression methodCallExpression) in d:\vs11Projects\ThirdParty\mongo-csharp-driver\Driver\Linq\Translators\PredicateTranslator.cs:line 133
at MongoDB.Driver.Linq.PredicateTranslator.BuildMethodCallQuery(MethodCallExpression methodCallExpression) in d:\vs11Projects\ThirdParty\mongo-csharp-driver\Driver\Linq\Translators\PredicateTranslator.cs:line 735
at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression) in d:\vs11Projects\ThirdParty\mongo-csharp-driver\Driver\Linq\Translators\PredicateTranslator.cs:line 73
...

我很感激,因为它试图将一个 $in:[] 查询放入另一个查询中。

这是集合中对象的样子;

    {
"_id" : ObjectId("50a5633292c3d22270ac2256"),
"pns" : [
{
"n" : "/standard",
"ns" : {
"v" : "standard"
}
}
]
}

所以 pns 是一个 PN 类型的数组,所以我不能简单地使用 Contains() 因为我不想匹配整个 PN 结构,只是 n 字段。我尝试过各种其他结构。

这是我在 shell 中能想到的最接近的东西;

db.collection.find({
"pns": {
"$elemMatch": {
"n": "/standard",
}
}
}).count();

但我什至找不到将其转换为 Linq 表达式的方法。

问题是否可以构建一个 linq 查询来匹配 pnslpn 的任何数组成员,但只匹配 n 字段?还是我必须手动构建这些查询?

更新

我想我差不多做到了。我认为我需要先转换为字符串数组,然后才能对查询进行任何有意义的操作,而且我认为我无法在 Linq 中做到这一点。所以这行得通;

var strArray = new[] { "/standard", "/my" };
Collection.AsQueryable<T>(o => o.pns.Any(pn => pn.n.In(strArray)));

这给了我;

{
"pns": {
"$elemMatch": {
"n": {
"$in": [
"/standard",
"/my"
]
}
}
}
}

但不幸的是,Driver 不够聪明,无法接受这一点;

Collection.AsQueryable<T>(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)));

请注意,您可以使用 List<string> 执行此操作以及你的情况。任何实现 IEnumerable<T> 的东西...

关于mongodb - 如何通过比较子字段构造 MongoDB Linq Any() 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13407588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com