【问题标题】:How to chain Linq methods dynamically in C#?如何在 C# 中动态链接 Linq 方法?
【发布时间】:2020-11-01 22:42:38
【问题描述】:

我使用 MongoDB 驱动程序,我有以下课程:

public class Transactions
{
    public ObjectId Id { get; set; }
    public int UserId { get; set; }
    public int AccountId { get; set; }
    public int SettingId { get; set; }
}
public class Account
{
    public int Id {get; set;}
    public int Name {get; set;}
}
public class User
{
    public int Id {get; set;}
    public int Name {get; set;}
}
public class Setting
{
    public int Id {get; set;}
    public int Name {get; set;}
}

我想根据用户的输入形成这个:

var docs = collection.Aggregate()
                     .Lookup("account", "AccountId", "_id", "asAccounts")
                     .Lookup("user", "UserId", "_id", "asUsers")
                     .Lookup("setting", "SettingId", "_id", "asSettings")
                     .As<BsonDocument>()
                     .ToList();

也就是说,如果用户只是想与帐户建立关系,请形成:

var docs = collection.Aggregate()
                         .Lookup("account", "AccountId", "_id", "asAccounts")
                         .As<BsonDocument>()
                         .ToList();

或者如果他想要与帐户和用户的关系:

var docs = collection.Aggregate()
                         .Lookup("user", "UserId", "_id", "asUsers")
                         .Lookup("setting", "SettingId", "_id", "asSettings")
                         .As<BsonDocument>()
                         .ToList();

我想做的是根据用户的需要形成查询。只是想知道如何在运行时链接方法。

【问题讨论】:

    标签: c# linq dynamic method-chaining


    【解决方案1】:

    您可以使用一些条件测试来创建您的动态链来准备查询:

    var docs = collection.Aggregate();
    
    if ( WantRelationWithAccount )
      docs = docs.Lookup("account", "AccountId", "_id", "asAccounts")
    
    if ( WantRelationWithUser )
      docs = docs.Lookup("user", "UserId", "_id", "asUsers")
    
    if ( WantSettings )
      docs = docs.Lookup("setting", "SettingId", "_id", "asSettings")
    
    var result = docs.As<BsonDocument>().ToList();
    

    但请记住,链中的操作顺序是添加的。

    Linq 查询被延迟执行,这意味着它们仅在与循环或任何导致执行的方法(如 ToList)一起使用时才会执行。

    有一个linq ToLookup 方法但没有Lookup,它会导致查询执行。

    Does ToLookup forces immediate execution of a sequence

    也许你使用了特殊框架提供的扩展方法。

    无论如何,暂存执行不会阻止您创建之前公开的链。

    【讨论】:

    • 我认为 AggregateLookup 在 Mongo 中有意义,是 MongoDB 驱动程序附带的方法。这让我想知道:他们看起来很流利,但他们的执行真的推迟了吗?
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多