让我们假设2个对象:
class A
{
string id;
List<B> items;
}
class B
{
string color;
string name;
}
我想在以下地址进行查询:
_ =&gt; _.id == myqueryid&amp;&amp; _.items.any(t =&gt; t.color ==“yellow)
到目前为止......太好了
现在,我想只恢复匹配的B类型对象,而不是整个对象;我怎么能这样做?
红利问题:有没有办法从B型对象中恢复单个字段?
这是现在的代码
var K = Driver.Find(_ => _.Id == Id && _.Items.Any(__ => __.Color == "Yellow"));
该部分有效。它恢复了正确的对象
var K = Driver.Find(_ => _.Id == Id && _.Items.Any(__ => __.Color == "Yellow").Project(P);
我的预测是:
Expression(_ => _.Ledger[-1])
但不知怎的,我没有得到我需要的数据。 如果我投射到动态并使用Include,我会得到它(以及_id),但它并不理想。
经过更多测试后:
.Include(_ => _.items[-1].color).Exclude(_ => _._id));
我希望这会返回颜色,但它会返回匹配的B对象......
答案 0 :(得分:1)
您可以尝试这样的聚合。
var result = collection.Aggregate()
.Match(_ => _.id == Id && _.items.Any(t => t.color == "yellow"))
.Unwind<A>(new StringFieldDefinition<A>("items"))
.ReplaceRoot<B>(new BsonValueAggregateExpressionDefinition<A, B>(@"$items"))
.First();