Использование строки в запросе LINQ

#c# #wpf #linq #where-clause #dynamic-queries

#c# #wpf #linq #where-предложение #динамические запросы

Вопрос:

В настоящее время я разрабатываю проект WPF на c #. Проект принимает строку (newMemoryRFID), которая определяется при инициализации страницы, и использует ее в запросе. Вот так

 var query = 
            from c in MemoryData.Memory
                    where c.RFID == newMemoryRFID
                    select c;
        this.DataContext = query;
        this.View = ((CollectionView)(CollectionViewSource.GetDefaultView(this.DataContext)));
  

В результате создается пустой DataContext

Однако, когда я использую тестовые данные, которые совпадают с тем, каким newMemoryRFID будет запрос, т. Е.

 var query = 
            from c in MemoryData.Memory
                    where c.RFID == "0F02D76B05"
                    select c;
        this.DataContext = query;
        this.View = ((CollectionView)(CollectionViewSource.GetDefaultView(this.DataContext)));
  

Запрос получает правильную запись. Как вы можете догадаться, я не лучший программист, поэтому чем проще ваш ответ, тем лучше. И заранее большое спасибо

Комментарии:

1. Если это работает, когда вы жестко кодируете строку newMemoryRFID, тогда проблема должна заключаться в newMemoryRFID . Установите точку останова в своем коде перед его выполнением. Затем проверьте значение newMemoryRFID . Скорее всего, там могут быть какие-то пробелы или что-то в этом роде.

Ответ №1:

Настало время использовать ваш отладчик. Похоже, что newMemoryRFID не имеет значения «0F02D76B05» во время создания запроса.

Если вы не можете вмешаться в это, по крайней мере, сделайте

 Debug.WriteLine(string.Format("newMemoryRFID = {0}", newMemoryRFID); 
  

перед строкой

 var query = ...
  

Комментарии:

1. Хотелось бы, чтобы это было так, но я проследил newMemoryRFID от начала до конца и, насколько я могу судить, это совпадает с тем, что я ожидаю, т.е. со строкой newMemoryRFID » n0F02D76B05 r»

2. Вы ожидаете, что newMemoryRFID будет включать n и r? Похоже, у вас есть дополнительные символы. Попробуйте использовать newMemoryRFID. Trim().

3. Я не ожидал их, но я пытался использовать . Trim() и это не помогло 🙁

4. Это должно записать false в трассировку отладки (или вы можете проверить это в немедленном окне или что-то еще). Отладка. WriteLine(строка. Формат («newMemoryRFID == «0F02D76B05″ равен {0}», newMemoryRFID == «0F02D76B05»); Эти дополнительные непечатаемые символы означают, что две строки не совпадают. Вам просто нужно очистить все, что вы получаете из своего источника. .Replace(«n», «»).Replace(» r», «») — это быстрый и о-о-очень простой способ. Изучите регулярные выражения или коммуникационные спецификации вашего RFID-считывателя (txt2re.com может помочь вам здесь).

Ответ №2:

Попробуйте обрезать строку как в начале, так и в конце на предмет возможных пробелов, которые не приведут к совпадению строк.