Запрос LiteDB в списке - PullRequest
       2

Запрос LiteDB в списке

0 голосов
/ 19 июня 2020

У меня проблемы с тем, чтобы понять, как эффективно запросить список внутри объекта.

У меня есть следующие классы:

 public class IdentitySubstitutionModel
 {
        public Guid Id { get; set; }
        public List<IdentityKeyPair> IdentityKeys { get; set; }

 }
 public class IdentityKeyPair 
 {
        public string Key { get; set; }

        public string Value { get; set; }
         ....
 }

Мне нужно выполнить запрос в списке IdentityKeys в IdentitySubstitutionModel, но единственный способ, которым я смог эффективно сделать это без получение ошибок занимает слишком много времени, сначала вызывая FindAll (), а затем выполняя запрос:

                using (var db = new LiteDatabase(_databaseFileName))
                {
                    // Get a collection (or create, if doesn't exist)
                    var collection = db.GetCollection<IdentitySubstitutionModel>(_tableName);

                    // Index document using document Name property
                    collection.EnsureIndex(x => x.IdentityKeys[0].Key);
                    collection.EnsureIndex(x => x.IdentityKeys[0].Value);

                    results = collection.FindAll().Where(p => p.IdentityKeys.Any(x => x.Key == 
                    identityKeyPair.Key && x.Value == identityKeyPair.Value)).ToList();
            }

Я пробовал много других способов, в том числе этот, но в итоге получаю сообщение об ошибке:

collection.Find(x => (x.IdentityKeys[0].Key == identityKeyPair.Key && x.IdentityKeys[0].Value == identityKeyPair.Value)).ToList();

Неправильно ли я строю индексы или мне нужен другой способ завершить запрос?

1 Ответ

0 голосов
/ 19 июня 2020

LiteDb - это движок No- Sql, он хранит данные как капли JSON. Есть индексы, как вы узнали, но эти индексы находятся на уровне JSON, на верхнем уровне, так же, как поиск.

Итак, если вы не можете вывести свое состояние на верхний уровень, движок придется распаковать каждый объект JSON, чтобы получить управляемый массив для применения вашего фильтра, что, очевидно, очень медленно.

Есть несколько способов сделать это, один из которых - изменить вашу коллекцию так, чтобы IdentityKeyPair и Guid были полями верхнего уровня, и вы повторяете одно и то же Guid для каждого IdentityKeyPair предполагается заменить.

...