#c# #linq
#c# #linq
Вопрос:
У меня это в переменной c:
c = "1,2,3,5,12"
Если я сделаю:
p = ctx
.PProject
.Where(x => x.PCountryCode == cC amp;amp;
x.PParentalGuidence == r amp;amp;
c.Contains(x.PTtId.ToString()))
.OrderByDescending(x => x.PId)
.ToList();
p
вернет 2
, если x.PTtId = 12
.
Но мне нужно, чтобы это вернулось 12
.
Как мне решить это с помощью целых чисел?
Комментарии:
1.
c.Split(',').Contains(x.PTtId.ToString())
вместоc.Contains(x.PTtId.ToString())
; в противном случае у вас будет ложноположительное решение, поскольку"12"
содержит"2"
2. Привет, спасибо за ваш ответ, я получаю сообщение об ошибке: Описание кода серьезности Ошибка состояния подавления строки файла проекта CS0854 Дерево выражений может не содержать вызова или вызова, который
3. Я поместил этот код в другую строку: string[] cc = c.Split(‘,’);
4. Это сработало нормально, спасибо 🙂
5.да, вы совершенно правы, лучше извлечь
Split
изWhere
intostring[] cc = c.Split(',');
, чтобы вычислить массив только один раз перед запросом
Ответ №1:
Я думаю, что ваша переменная c должна содержать список идентификаторов, разделенных запятыми. Первое изменение списка, разделенного строкой, на пример массива идентификаторов.
string c = "1,2,3,5,12";
var d = c.Split(',');
Этот массив будет использоваться во второй части программного кода:
p = ctx
.PProject
.Where(x => x.PCountryCode == cC amp;amp;
x.PParentalGuidence == r amp;amp;
d.Contains(x.PTtId.ToString()))
.OrderByDescending(x => x.PId)
.ToList();
Ответ №2:
Если я правильно понимаю, вы запрашиваете базу данных в своем выражении Linq. Если это так, вам следует попытаться передать в выражение массив целых чисел, чтобы позволить интерпретатору генерировать IN
выражение, управляемое индексом.
Что-то такое простое, как:
string c = "1,2,3,5,12";
var idArray = c.Split(',').Select(s => int.Parse(s)).ToArray();
var p = ctx
.PProject
.Where(x => x.PCountryCode == cC amp;amp;
x.PParentalGuidence == r amp;amp;
idArray.Contains(x.PTtId))
.OrderByDescending(x => x.PId)
.ToList();
Код почти тот же, но производительность может сильно отличаться.
Проверьте сгенерированный SQL, чтобы знать наверняка.