C# 在保留类型信息的同时使用切片投影
我有一个名为Student的类型,它有三个属性:C# 在保留类型信息的同时使用切片投影,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我有一个名为Student的类型,它有三个属性: | Student | |------------------------| | Id: string | | Name: string | | CoursesTaken: string[] | CoursesTaken属性按所选课程的顺序保存所选课程的id,因此该数组中的最后一个元素将是学生所选最后一门课程的id 现在我想查询最后一门课程是X的学生的集合。我猜Proje
| Student |
|------------------------|
| Id: string |
| Name: string |
| CoursesTaken: string[] |
CoursesTaken
属性按所选课程的顺序保存所选课程的id,因此该数组中的最后一个元素将是学生所选最后一门课程的id
现在我想查询最后一门课程是X的学生的集合。我猜ProjectionDefinitionBuilder.Slice
是使用的方法
我不想求助于BsonDocuments,因为我想在整个过程中保留类型推断,因为我以后会添加更多的过滤器。因此,我想传入一个IAggregateFluent
,我想返回一个IAggregateFluent
有没有办法做到这一点
更新:
我无法让Ryans的例子(如下)发挥作用的原因是我实际上没有完全遵循它。这就是我发现的:
//这不起作用(抛出NotSupportedException):
contacts.Aggregate()
.项目=>新建
{
水果=s,
LastNode=s.Path.Last()
})
.Match(x=>x.LastNode==“avacados”)
.项目(x=>x.Fruit);
//但这一条有效:
contacts.Aggregate()
.项目=>新建
{
Id=s.Id,
Name=s.Name,
路径=s.路径,
LastNode=s.Path.Last()
})
.Match(x=>x.LastNode==“avacados”)
.项目(x=>新水果
{
Path=x.Path,
Id=x.Id,
Name=x.Name
});
这似乎可行,但由于预测的原因,这并不理想
var query=collection.Aggregate()
.项目=>新建
{
s、 身份证,
s、 名字,
s、 卡斯塔肯,
lastCourse=s.CoursesTaken.Last()
})
.Match(x=>x.lastCourse==“avacados”)
.Project(x=>新生
{
Id=x.Id,
Name=x.Name,
CoursesTaken=x.CoursesTaken
});
这是一个完整的测试程序
使用MongoDB.Driver;
使用MongoDB.Entities;
使用MongoDB.Entities.Core;
使用System.Linq;
命名空间堆栈溢出
{
公共班级学生:实体
{
公共字符串名称{get;set;}
公共字符串[]CoursesTaken{get;set;}
}
公共课程
{
静态void Main(字符串[]参数)
{
新数据库(“测试”、“本地主机”);
(新生
{
Name=“哈利波特”,
CoursesTaken=新[]{“咒语”、“扫帚”、“阿瓦卡多斯”}
}).Save();
var query=DB.Fluent()
.项目=>新建
{
s、 身份证,
s、 名字,
s、 卡斯塔肯,
lastCourse=s.CoursesTaken.Last()
})
.Match(x=>x.lastCourse==“avacados”)
.Project(x=>新生
{
ID=x.ID,
Name=x.Name,
CoursesTaken=x.CoursesTaken
})
.ToList();
}
}
}
想想你会怎么做:最后一门课是由student.Courses.last()完成的。
。现在检查这是否等于课程X
的课程id。最后,循环所有学生并重复。我不熟悉Mongo,但在大多数db中都是这样做的。不幸的是,这个表达式不会翻译(MongoDB驱动程序将通过NotSupportedException进行翻译)。与LINQ to SQL非常相似,这里的想法是使用一个表达式,驱动程序可以将其转换为db可以理解的内容。因此,您基本上需要db.getCollection(“学生”).aggregate([{“$project”):{“Name”:1.0,“Stuff”:{“$slice”:[{“$reverseArray”:“$CoursesTaken”},0.0,1.0]}},{“$match”:{“Stuff”:“X”}]
,但我也不知道怎么做。这对你有用吗?我也试过使用.Last()在一个投影表达式中,但我得到了一个NotSupportedException。我应该补充一点,我在Linux容器中运行它,我看到mongodb c#驱动程序在其他情况下的行为与Windows不同。@JohnKnoop是的,它工作得非常好。至少在Windows上是这样。您运行的是最新版本的驱动程序吗?甚至显示它是支持。我正在使用版本2.9.2,所以它应该足够新。我想我必须在他们的Jira上发布错误报告。非常感谢!我发现了问题。我会将它附加到我的初始问题中。