Данные запроса с использованием ключевого слова "Содержит" в 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));