Как динамически связывать методы Linq в C#? - PullRequest
1 голос
/ 12 июля 2020

Я работаю с драйвером 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();

Я пытаюсь сформировать запрос в зависимости от потребностей пользователя. Просто хочу знать, как связать методы во время выполнения.

1 Ответ

0 голосов
/ 12 июля 2020

Вы можете создать свою динамическую цепочку c, используя некоторые условные тесты для подготовки запроса:

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 запросы выполняются с отложенным выполнением, это означает, что они выполняются только при использовании, например, с al oop или любым методом, который вызывает выполнение, например ToList.

Существует метод linq ToLookup, но не Lookup, и это вызывает выполнение запроса.

Принудительно ли ToLookup вызывает немедленное выполнение последовательности

Возможно, вы используете методы расширения, предоставляемые специальной структурой.

В любом случае, поэтапное выполнение не мешает вам создать цепочку, как показано ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...