Linq — Как запросить строку [] целого числа как строковый тип данных

#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 into string[] 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, чтобы знать наверняка.