Ravendb Array пересекаются

У меня есть простая таблица дБ Raven, которая выглядит следующим образом:

char[] colorArray= colorValue.ToCharArray().Distinct().ToArray();

for loop{
var entity = new Color { ID = id, colorArray = colorArray };
session.Store(entity);
}
Session.Savechanges();

Эта таблица состоит из 1000 или более записей.


Теперь пользователь вводит массив:

char[] userinput=userinput.tocharArray().Distinct().ToArray();

Предположим, пользовательский массив состоит из символов "r", "e" и "d". Мне нужно перечислить все записи, которые состоят из всех введенных пользователем символов (т.е. выходные записи должны иметь символы "r", "e" и "d").

Я пробовал разные методы, включая следующие:

.Where(x=>x. colorArray.Intersect(userinput).Count()==userinput.count())

Но не работает, выдавая следующую ошибку: Не могу понять, как перевести x.subsetArray.Intersect…

1 ответ

Решение

Пересечение массива недопустимо, но вы можете написать свой запрос следующим образом:

var colors = session.Query<Color>()
                    .Where(c =>
                            c.colorArray.Any(x => x == "r") &&
                            c.colorArray.Any(x => x == "e") &&
                            c.colorArray.Any(x => x == "d"));

Обратите внимание, что для того, чтобы это работало, вам нужно использовать stringс не chars. colorArray собственность в вашем Color класс должен быть определен как:

public string[] colorArray { get; set; }

Причина в том, что если вы используете char[]тогда запрос будет проверять числовые значения (коды ASCII), а не строковые значения (например: 'r' будет интерпретироваться механизмом запросов как 114, 'e' в 101 а также 'd' в 100).

Теперь перейдем к следующему шагу и сделаем условие запроса динамическим по отношению к userInput строковый массив:

var userInput = new[] {"r", "e", "d"};

var colors = session.Query<Color>();

// dynamically add a WHERE clause for each letter in the array
foreach (var letter in userInput)
{
    var currentLetter = letter;

    colors = colors.Where(c => c.colorArray.Any(x => x == currentLetter));
}

// display the results
foreach (var color in colors)
    Console.WriteLine(color);

Это должно дать ожидаемые результаты: документы, которые имеют "r", "e" а также "d" в их colorArray.

Другие вопросы по тегам