Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在保留类型信息的同时使用切片投影_C#_Mongodb_Mongodb .net Driver - Fatal编程技术网

C# 在保留类型信息的同时使用切片投影

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的类型,它有三个属性:

| 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上发布错误报告。非常感谢!我发现了问题。我会将它附加到我的初始问题中。