gpt4 book ai didi

c# - 如何使用 Linq 查询嵌套的动态 BsonDocuments?

转载 作者:太空宇宙 更新时间:2023-11-03 16:01:13 26 4
gpt4 key购买 nike

public class Foo
{
public ObjectId _id { get; set; }
public BsonDocument properties { get; set; }
}

public void FindFoos()
{
var client = new MongoClient(ConfigurationManager.ConnectionStrings["MongoDB"].ConnectionString);
var server = client.GetServer();
var db = server.GetDatabase("FooBar");
//var collection = db.GetCollection<GeoJsonFeature<GeoJson2DGeographicCoordinates>>("Sections");
var collection = db.GetCollection<Foo>("Foos");



collection.Insert(new Foo
{
properties = new BsonDocument{
{"Foo" , "foo1"},
{"Bar" , "bar1"}
}
});
collection.Insert(new Foo
{
properties = new BsonDocument{
{"Foo" , "foo2"},
{"Bar" , "bar2"}
}
});


var query = Query<Foo>.Where(foo => foo.properties.AsQueryable().Any(property => property.Name == "Foo" && property.Value.AsString == "foo1"));

var result = collection.Find(query).First();
}

调用 FindFoos 会导致以下异常:

不支持 where 子句:Queryable.Any(Queryable.AsQueryable(foo.properties), (BsonElement property) => ((property.Name == "Foo") && (property.Value.AsString == "foo1") )).

描述:当前网络请求执行过程中出现未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

异常详细信息:System.ArgumentException:不受支持的 where 子句:Queryable.Any(Queryable.AsQueryable(foo.properties), (BsonElement property) => ((property.Name == "Foo") && (property.Value. AsString == "foo1"))).

在线:

var query = Query<Foo>.Where(foo => foo.properties.AsQueryable().Any(property => property.Name == "Foo" && property.Value.AsString == "foo1"));

我可以在 mongodb shell 中轻松地执行此查询:

db.Foos.find( {'properties.Foo' : 'foo1'} );

使用 Linq 执行此查询的正确方法是什么?

最佳答案

试试 LINQ 的 SelectMany() 方法。它用于展平嵌套集合。我们可以用更“LINQ”的方式完成任务,而不是使用嵌套的 for 循环。

例子如下 -

Master m1 = new Master() { name = "A", lstObj = new List<obj> { new obj { i = 1, s = "C++" }, new obj { i = 1, s = "C#" }, new obj { i = 1, s = "Java" } } };

Master m2 = new Master() { name = "A", lstObj = new List<obj> { new obj { i = 4, s = "PHP" }, new obj { i = 5, s = "Ruby" }, new obj { i = 6, s = "Perl" } } };

List<Master> lstMasters = new List<Master> { m1, m2 };
var result = lstMasters.SelectMany(m => m.lstObj).Where(o => o.s == "PHP");

只需将 Master 类替换为您的 BsonDocument

关于c# - 如何使用 Linq 查询嵌套的动态 BsonDocuments?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21290133/

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