gpt4 book ai didi

c# - 如何使用 Linq 查询 Mongo C# 2.2 驱动程序中的嵌套列表?

转载 作者:可可西里 更新时间:2023-11-01 09:54:37 29 4
gpt4 key购买 nike

如何用Linq做聚合查询。我知道有一个 AsQueryable() 接口(interface)。但是当我进行聚合时似乎会抛出错误。

如果我有一个名为 person 的集合,它存储这样的数据:

  {
"Name": "Punny",
"Interests": [
1,
2
]
}

另一个名为interests 的集合存储这样的数据:

  {
"_id":1,
"name":"music"
},
{
"_id":2,
"name":"read"
}

我想得到这样的东西:

  {
"Name": "Punny",
"Interests": [
"music",
"read"
]
}

如何使用 AsQueryable 通过 Linq to 实现此目的?我试过这个:

_context.People.AsQueryable()
.Select(p => new
{
Name = p.Name,
Interests = p.InterestingIds
.Join(_context.Interests.AsQueryable(),
per => per,
i => i.Id,
(per, i) => new {i.Name})
}).ToList();

它抛出一个 System.NotSupportedException

System.NotSupportedException : Join of type System.Linq.Enumerable is not supported in the expression tree {document}{InterestingIds}.Join([FunnyMongoBlog.interest], per => per, i => i.Id, (per, i) => new <>f__AnonymousType1`1(Name = i.Name)).

我尝试了两次数据库访问:

      var person = _context.People.AsQueryable()
.Single(p => p.Name == "Punny");
var ids = person.InterestingIds;
var query = _context.Interests.AsQueryable()
.Where(i => ids.Contains(i.Id)).ToList();
var result = new
{
person.Name,
Interest = query
};

这是可行的,但我想知道我们是否可以一次完成,以便数据库可以处理聚合。

最佳答案

您可以在聚合框架中执行此操作,但我建议在 mongoDB 中使用 subDocumnets 的强大功能并将这些元素完全嵌入到主文档中。换句话说,我们需要从关系思维转变为文档思维。

我建议的对象形状:

{
"Name" : "Punny",
"Interests" : [{
"_id" : 1,
"name" : "music"
}, {
"_id" : 2,
"name" : "read"
}
]
}

在 C# 代码中

class MyClass {
public string Name;
public List < Interest > Interests;
}

class Interest {
public int Id;
public string Name;
}

现在请找到有问题的转换请求所需的 bson 文档:

db.col.aggregate([{
$unwind : "$Interests"
}, {
$lookup : {
from : "interests",
localField : "Interests",
foreignField : "_id",
as : "interest"
}
}, {
// now we need to reshape document
$project : {
_id : 1,
Name : 1,
Interests : "$interest.name"
}
},
//group documents back
{
$group : {
_id : {
id : "$_id",
name : "$Name"
},
Interests : {
$push : "$Interests"
}
}
}, {
//final reshape
_id : "$_id.id",
Name : "$_id.name",
Interests : 1
}
])

并决定嵌入是否值得一试:-)

欢迎任何评论!

关于c# - 如何使用 Linq 查询 Mongo C# 2.2 驱动程序中的嵌套列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38006351/

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