簡體   English   中英

如何在C#中使用mongo驅動程序按條件排序

[英]How to sort by condition using the mongo driver in c#

我一直在關注mongo驅動程序(2.4)文檔,並且目前在嘗試將條件作為排序時陷入困境。

根據文檔,我得到了一個AsQueryable實例,並將where函數與傳入的表達式一起使用。在我想按條件而不是按字段進行排序之前,這種方法一直有效。

以下是我要訂購的商品:

db.child.AsQueryable().Where(expression).OrderBy(x=> x.parentId == someParentId); 

這應該是在linq的路線

SELECT * FROM child
ORDER BY
  CASE parentId
  WHEN someParentId THEN 1
  ELSE 2 END,
  parentId; 

但是,當前,在運行OrderBy條件后,我相信它正在評估表達式,因為從調試器中我可以看到表達式變化,如下所示:

在此處輸入圖片說明

因此,兩個主要問題是:

  1. 如何使用.net mongo驅動程序按布爾表達式排序。
  2. 為什么如屏幕截圖所示轉換表達式?

Mongo驅動程序文檔(2.4)

如MongoDB C#驅動程序文檔所述(來自粘貼的鏈接):

該驅動程序包含針對聚合框架的LINQ實現。

因此,在Aggregation Framework中必須有相應的操作才能從LINQ進行翻譯。 您調用.AsQueryable() ,這意味着您可以使用LINQ語法構建表達式,但是當需要轉換為Aggregation Framework時,它將失敗。 不幸的是,您不能在$ sort中包含表達式,這就是為什么您的代碼將失敗的原因。

要解決此問題,可以使用$ addFields階段添加一個附加字段MatchesParent並按此字段排序。

假設您的模型由以下類表示:

public class Model
{
    [BsonId]
    public ObjectId Id { get; set; }
    public string ParentId { get; set; }
    // some other properties
}

您可以添加以下類:

public class ModelResult: Model
{
    public bool MatchesParent { get; set; }
}

然后可以將$addFields定義為PipelineStageDefinitionnameof運算符,以使其保持強類型:

PipelineStageDefinition<Model, ModelResult> addFields = new BsonDocument() {
            { "$addFields", new BsonDocument() {
                    { nameof(ModelResult.MatchesParent), new BsonDocument() {
                        { "$eq", new BsonArray() { "$" + nameof(Model.ParentId), someParentId } }
                    }
                }
            }
        }
    };

var result = Col.Aggregate()
                .Match(expression)                           
                .AppendStage(addFields)
                .SortByDescending(x => x.MatchesParent)
                .ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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