Данные запроса с использованием ключевого слова "Содержит" в Dynamic Linq в С#

Я столкнулся с некоторой проблемой при выполнении запроса с ключевым словом "Содержит" в Dynamic linq на С#. Я получаю ошибку ниже

В типе 'Int32' нет свойства или поля

Мой код выглядит следующим образом:

Если я использую ключевое слово "Содержит" для строкового поля типа данных, то он отлично работает, как показано ниже

string[] CandidateNamesArray = new string[]{"Ram", "Venkat", "Micheal"}
var dynamicLinqQuery = Candidates.Where("CandidateName.Contains(@0)", CandidateNamesArray );
  • работает отлично

Но если я использую ключевое слово "Содержит" для поля int datatype, тогда он выдает исключение, как показано ниже

int[] CandidateIdsArray = new int[]{4, 78, 101}
var dynamicLinqQuery = Candidates.Where("CandidateId.Contains(@0)", CandidateIdsArray);

Исключение времени выполнения - "Нет применимого метода" Содержит "существует в типе 'Int32'"

Также пробовал по-другому, как показано ниже

int[] CandidateIdsArray = new int[]{4, 78, 101}
var dynamicLinqQuery = Candidates.Where("@0.Contains(CandidateId)", CandidateIdsArray);

Исключение времени выполнения - "Нет свойства или поля" CandidateId "существует в типе 'Int32'"

Я потратил почти 2 дня, чтобы решить вышеуказанную проблему, но не смог добиться успеха. Может ли кто-нибудь помочь мне в решении вышеупомянутого вопроса... Спасибо в Advance

Ответ 1

Я знаю это долгое время с вашего поста, но сегодня я столкнулся с той же проблемой.

Я решил это, используя outerIt перед свойством внутри Contains.

В вашем примере:

int[] CandidateIdsArray = new int[]{4, 78, 101}
var dynamicLinqQuery = Candidates.Where("@0.Contains(outerIt.CandidateId)", CandidateIdsArray);

Он работал у меня, потому что DynamicLinq думал, что CandidateId является свойством объекта массива. И используя externalIt, он понял, что он относится к внешнему итератору, который является кандидатом.

Ответ 2

Вы можете использовать преобразование своего массива в строку, а затем сделать Contains(), чем преобразовать его обратно в int

Ответ 3

Похоже, вы проверяете неправильную вещь. В первом запросе вы фактически проверяете, когда поле "CandidateName" содержит другую строку, и это работает. Но во втором примере вы проверяете, содержит ли поле "CandidateId" другой int. И int не может содержать другой int, поэтому вы получаете сообщение об ошибке.

Edit:

Похоже, что в третьем примере код и исключение не совпадают. Вы получите исключение "No property or field 'CandidateId' exists in type 'Int32'", если код был:

int[] CandidateIdsArray = new int[]{4, 78, 101}
var dynamicLinqQuery = 
      CandidateIdsArray.Where("@0.Contains(CandidateId)", CandidateIdsArray);

Но предоставленный вами код выглядит корректно и должен работать:

int[] CandidateIdsArray = new int[]{4, 78, 101}
var dynamicLinqQuery = 
      Candidates.Where("@0.Contains(CandidateId)", CandidateIdsArray);

Ответ 4

Я не знаю Dynamic Linq, но мне кажется очевидным, что тип Int32 не содержит никакого метода, называемого Contains. Как преобразовать его в string перед вызовом Contains?

var dynamicLinqQuery = Candidates.Where("CandidateId.ToString().Contains(@0)", CandidateIdsArray);

Ответ 5

Попробуйте следующее:

var validCandidateIds = new List<int>(){4, 78, 101};
var filteredCandidates = Candidates.Where(
    "@0.Contains(CandidateId)", validCandidateIds);

Должен быть равен (но, вероятно, медленнее):

var validCandidateIds = new List<int>(){4, 78, 101};
var filteredCandidates = Candidates.Where(
    c => validCandidateIds.Contains(c.CandidateId));