[英]MongoDB LINQ joining on collection property type's property
我有以下類,它們通過 MongoDb 持久化:
public class TypeA
{
public string Name { get; set; }
public List<TypeB> Children { get; set; }
}
public class TypeB
{
public string Colour { get; set; }
}
我正在加入兩個 A 型的 collections,如下所示:
IQueryable<TypeA> collection1 = GetCollection();
IQueryable<TypeA> collection2 = GetCollection();
var query = from a in collection1
join b in collection2
on a.Name equals b.Name
select new { a.Name };
var list = query.ToList();
除了 Color 屬性的子屬性 collections 之外,我該如何做類似的事情?
我已經嘗試了以下內容,但是 MongoDb Linq 驅動程序顯然不喜歡連接子句中的 SelectMany 語句:
IQueryable<TypeA> collection1 = GetCollection();
IQueryable<TypeA> collection2 = GetCollection();
var query = from a in collection1.SelectMany(a => a.Children)
join b in collection2.SelectMany(b => b.Children)
on a.Colour equals b.Colour
select new { a.Colour };
var list = query.ToList();
LINQ 不是此類操作的前進路徑,因為驅動程序無法將此類語法轉換為 MongoDB 的聚合框架。
您需要使用的管道階段是帶有自定義管道的 $lookup,它允許您指定自定義“加入”條件。 在這種情況下,您需要$setEquals或$setIsSubset 。 您的 C# 代碼可能如下所示:
var letDef = BsonDocument.Parse("{ colA_Children: '$Children' }");
var filter = new BsonDocumentFilterDefinition<TypeA>(BsonDocument.Parse("{ $expr: { $setEquals: [ '$$colA_Children', '$Children' ] } }"));
var pipeline = new PipelineStagePipelineDefinition<TypeA, TypeA>(
new IPipelineStageDefinition[]
{
PipelineStageDefinitionBuilder.Match(filter),
});
var fieldDef = new ExpressionFieldDefinition<AggResult, List<TypeA>>(f => f.Matched);
var results = col1.Aggregate()
.Lookup<TypeA, TypeA, List<TypeA>, AggResult>(
foreignCollection: col2,
let: letDef,
lookupPipeline: pipeline,
@as: fieldDef
).ToList();
在哪里:
[BsonIgnoreExtraElements]
public class AggResult : TypeA
{
public List<TypeA> Matched { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.