Daniel Andrei Popescu Ответов: 1

Почему я получаю нулевые значения в своей последовательности linq?


Еще раз здравствуйте уважаемые программисты,

Я борюсь в течение нескольких дней с проблемой, связанной с моим запросом linq.


Когда я отлаживаю и навожу курсор мыши на education,значение(которое является строкой) пусто.Хуже всего то,что когда я заменяю его строкой из своей базы данных, он работает идеально.Я не публиковал обязательную часть,так как она работает,когда я заменяю"образование" обычной строкой, но если она имеет какое-то отношение, пожалуйста, скажите мне, чтобы я мог ее опубликовать.В чем будет заключаться проблема для пустой строки?Я искал ответ и перепробовал множество подходов,но все они потерпели неудачу.Я использую linq с sql.Спасибо!

Что я уже пробовал:

Это мой текущий код:
модель представления:
private String education;
      public String Education
      {
          get { return education; }
          set
          {
              if (education != value)
              {
                  education = value;
                  NotifyOnPropertyChange("Education");
              }
          }
      }
Это строка, в которую я хочу передать значение.

Это мой метод:
public List<Cours> CreateCrazy()
     {
         using (DatabaseStudentsEntities1 db = new DatabaseStudentsEntities1())
         {
             if(education==null)
             {
                 education = "";
             }
             try
             {

                 var query = (from data in db.Courses where data.education==education select new { CourseName = data.courseName }).ToList().Select(c => new Cours { courseName = c.CourseName }).ToList();
                 return query.ToList();

             }

             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }
         }
         return null;
     }
"образование" - это нулевое значение.

Maciej Los

public List<Cours> CreateCrazy()
{
using (DatabaseStudentsEntities1 db = new DatabaseStudentsEntities1())
{
if(education==null)

Где образование исходит из вышеприведенного фрагмента кода?

#realJSOP

Есть ли в базе данных вхождения нулевого значения столбца education?

Daniel Andrei Popescu

Здравствуйте,нет, в столбце образование нет нулевых значений.Вместо этого есть 4 значения,которые я привязал к combobox.

1 Ответов

Рейтинг:
4

Jon McKee

Как отметил Мацей в своем комментарии, ваша проблема, скорее всего, заключается в следующем:

private String education; //implied default of null
public String Education
{
    get { return education; } //simply a return
}

public List<Cours> CreateCrazy()
{
    using (DatabaseStudentsEntities1 db = new DatabaseStudentsEntities1())
    {
        //Education/education will always be null if it hasn't been set yet.
        if(education==null)
        {
            education = "";
        }
    }
}

Мое лучшее предположение заключается в том, что это не работает, потому что, однако, вы обычно тестируете его education не устанавливается так оно и есть null который получает дефолт по умолчанию "" внутри CreateCrazy. Когда вы заменяете education с жестко закодированной строкой это работает, потому что нет ничего технически неправильного в запросе LINQ. Скорее всего, это проблема в вашей привязке.

Дополнительные Мысли:
Свойства: Всегда устанавливайте значение по умолчанию для свойства или поля, если это необходимо, а не по умолчанию внутри метода. Это обеспечивает согласованность состояния переменной. Поскольку код написан сейчас, есть два состояния по умолчанию в зависимости от того, является ли он CreateCrazy был вызван - null и "".

Функции: Если это возможно, хорошей практикой является попытка сохранить единую точку выхода для функций. Это делает код более легким для чтения, следования и, следовательно, поддержания. Это связано с еще одной хорошей практикой, на мой взгляд, - устранить как можно больше null опора, насколько это возможно. Если вы вызываете функцию, которая запрашивает и возвращает массив результатов, разве вы не ожидаете, что "нет результатов" будет просто пустым массивом? Это также позволяет упростить потребляющий код. Вместо того чтобы делать это null проверку можно просто повторить. Если нет никаких результатов, цикл просто немедленно завершится.

LINQ: Слишком много ToList звонки. ToList принудительно вычисляет выражение LINQ так что никогда ToList запрос результатов, если он не закончен. Оба вызова могут быть удалены из запроса и просто оставить ToList о возвращаемом значении. Также не нужна вторая часть запроса. Ты захватываешь courseName в анонимный объект, а затем передача этих данных в типизированный объект в другом операторе select. Наберите его в первый раз.

Изменено с предложениями:
private String education = string.Empty;
public String Education
{
    get { return education; }
    set
    {
        if (education != value)
        {
            education = value;
            NotifyOnPropertyChange("Education");
        }
    }
}

public List<Course> CreateCrazy()
{
    List<Course> courseResult = new List<Course>();
    using (DatabaseStudentsEntities1 db = new DatabaseStudentsEntities1())
    {
        try
        {
            var query = from data in db.Courses
                        where data.education == Education
                        select new Course { 
                            CourseName = data.courseName 
                        };
            courseResult.AddRange(query);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    return courseResult;
}


Daniel Andrei Popescu

Здравствуйте,большое вам спасибо за ваш ответ.Я попробовал версию, которую вы мне дали, но я все еще получаю ошибку n в "CourseName", говоря, что моя таблица "Cours" не содержит определения для нее.Поскольку я принимаю во внимание ваш совет,я также попробовал вместо"select new Cours{CourseName = data.courseName}"-"select new {CourseName = data.courseName}", но в этом случае у меня есть ошибка в запросе, говорящая, что тип запроса не совместим с IQueryable.Кроме того,я понимаю вашу логику из решения и постараюсь адаптировать ее настолько, насколько смогу, и надеюсь, что она сработает.

Спасибо и с наилучшими пожеланиями,

Jon McKee

Первая проблема, вероятно, связана с корпусом. Ваша собственность-это courseName на Cours. Я всегда Паскаль-регистр имен свойств, поэтому я написал его CourseName

Не уверен по второму вопросу. LINQ to Entities может быть чувствителен к операторам select. Это может быть жалоба, если Cours не имеет общедоступного конструктора без параметров по умолчанию.

Daniel Andrei Popescu

Я нашел решение.Все это было в привязке в файле .xaml,потому что после короткого исследования реальной проблемы я обнаружил,что метод был хорош, но мне нужно было иметь в выпадающем списке:"Text={Binding Education}", и он отлично работает.

Jon McKee

Рад слышать, что ты все понял! Связывание иногда может быть болью.

Daniel Andrei Popescu

- Да,я знаю...Большое вам спасибо за вашу помощь!Желаю вам прекрасного дня :)