如何使用Mongo C#Driver 2.3中的Mongo.Driver.Linq返回包含已过滤子文档的文档?

如何使用Mongo C#Driver 2.3中的Mongo.Driver.Linq返回包含已过滤子文档的文档?,c#,mongodb,linq,mongodb-.net-driver,C#,Mongodb,Linq,Mongodb .net Driver,鉴于以下情况,如何返回所有包含TypeOfBar==“Big”的条的Foo,并将Foo的条限制为仅包含TypeOfBar==“Big”的条 公共类Foo { 公共字符串_id{get;set;} 公共列表栏{get;set;} } 公共类酒吧 { 公共字符串_id{get;set;} 公共字符串类型为{get;set;} } 我可以很容易地得到第一部分(所有带有特定类型条的foo): var client=newmongoclient(“myconnectionstring”); var db

鉴于以下情况,如何返回所有包含TypeOfBar==“Big”的条的Foo,并将Foo的条限制为仅包含TypeOfBar==“Big”的条

公共类Foo
{
公共字符串_id{get;set;}
公共列表栏{get;set;}
}
公共类酒吧
{
公共字符串_id{get;set;}
公共字符串类型为{get;set;}
}
我可以很容易地得到第一部分(所有带有特定类型条的foo):

var client=newmongoclient(“myconnectionstring”);
var db=client.GetDatabase(“myDb”);
var collection=db.GetCollection(“Foos”);
var foos=collection.AsQueryable(),其中(x=>x.bar.Any(b=>b.TypeOfBar==“Big”);

但是,我很难弄清楚如何让db返回带有筛选条列表的FOO。

如果您只想筛选出具有“Big”类型的FOO,则应应用
ElemMatch
投影:

var res = collection.Find(x => x.Bars.Any(b => b.TypeOfBar == "Big"))
    .Project(Builders<Foo>.Projection.ElemMatch(x=>x.Bars, b=>b.TypeOfBar == "Big"));
var res=collection.Find(x=>x.bar.Any(b=>b.TypeOfBar==“大”))
.Project(Builders.Projection.ElemMatch(x=>x.bar,b=>b.TypeOfBar==“大”);
您将遇到的问题是:投影将返回BSon。也许这就是您需要的,您可以接受它,如果不需要,您可以将Bson反序列化到您的Foo类。完整的查询我确实看起来像:

var res = collection.Find(x => x.Bars.Any(b => b.TypeOfBar == "Big"))
    .Project(Builders<Foo>.Projection.ElemMatch(x=>x.Bars, b=>b.TypeOfBar == "Big"))
    .ToEnumerable()
    .Select(b=>BsonSerializer.Deserialize<Foo>(b))
    .ToList();
var res=collection.Find(x=>x.bar.Any(b=>b.TypeOfBar==“大”))
.Project(Builders.Projection.ElemMatch(x=>x.bar,b=>b.TypeOfBar==“大”))
.可计算的()
.Select(b=>BsonSerializer.Deserialize(b))
.ToList();

我想你误解了我的要求。是的,您的两个示例都返回具有TypeOfBar==“Big”条的Foo,但是,它们也不会将返回的Foo条过滤为仅具有TypeOfBar==“Big”条的Foo条。因此这在上面的玩具案例中起作用,其中Foo只有一个_id和一个条列表,但是如果Foo具有一些附加属性,上面的答案不起作用……返回的foo只有一个条列表,但没有填写它们的其他属性。如何返回带有过滤条列表的Foo以及Foo的其他属性?
var res = collection.Find(x => x.Bars.Any(b => b.TypeOfBar == "Big"))
    .Project(Builders<Foo>.Projection.ElemMatch(x=>x.Bars, b=>b.TypeOfBar == "Big"));
var res = collection.Find(x => x.Bars.Any(b => b.TypeOfBar == "Big"))
    .Project(Builders<Foo>.Projection.ElemMatch(x=>x.Bars, b=>b.TypeOfBar == "Big"))
    .ToEnumerable()
    .Select(b=>BsonSerializer.Deserialize<Foo>(b))
    .ToList();