簡體   English   中英

MongoDB LINQ 加入集合屬性類型的屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM