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
с не char
s. 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.