LINQ Query Issue, последовательность не содержит элементов - PullRequest
7 голосов
/ 28 марта 2012

Я пытаюсь обновить одну запись в таблице, но когда я запускаю .Firstordefault(), я получаю сообщение об ошибке: «Ссылка на объект не установлена ​​для экземпляра объекта.», И если использовать ее с .First(), Я получаю «Последовательность не содержит элементов».

Использование его в другом месте, работает нормально, но на этот раз вызывает ошибки.

Вот код:

public class AllownceDetails
{
  public int ta_id{get;set;}
  public int tvrid{get;set;}
  public DateTime ofDate{get;set;}
  public string status{get;set;}
  public string userid {get;set;}
}
//Update Method
public void Update(AllownceDetails Allowncedtl)
    {

        var ta = (from a in ce.tbl_tvrallownce
                  where a.tvrid == Allowncedtl.tvrid 
                   //error: Sequence contains no elements

                  select a).SingleOrDefault();

        ta.status = Allowncedtl.status; 
                   //error:Object reference not set to an instance of an object
        ce.SaveChanges();


    }

Ответы [ 3 ]

20 голосов
/ 28 марта 2012

Запрос не должен возвращать какие-либо данные.Запустите профилировщик в базе данных SQL, чтобы увидеть, как выполняется физический запрос, и попробуйте выполнить его вручную для базы данных, чтобы увидеть, как выглядят данные.Вам, вероятно, придется скорректировать запрос (или данные), чтобы получить результаты, которые вы ищете.

«Последовательность не содержит элементов» - это, по сути, способ LINQ сообщить вам, что вы пытаетесь сослаться на элементиз списка, который ничего не имеет.Поэтому вызовы, такие как .First() или .Single(), не могут ничего найти, поэтому возникает ошибка.

Когда вы изменяете вызовы на что-то вроде .FirstOrDefault() или .SingleOrDefault(), тогда они переходят с "default"значение для этого типа, а для ссылочных типов по умолчанию null.Так что если вы установите что-то на null, а затем попытаетесь вызвать метод, вы получите object reference not set to an instance of an object.

5 голосов
/ 28 марта 2012

Метод Single выдает это исключение, если в списке (запросе) нет элементов или имеется несколько элементов.

Метод SingleOrDefault вызывает исключениев списке несколько элементов.Возвращает ноль, если нет элементов.

Метод FirstOrDefault возвращает первый элемент в списке или ноль.Исключений нет.

Используйте его и проверьте ссылку на null

if (ta != null )
   {
      ta.status = Allowncedtl.status; 
      ce.SaveChanges()
   }

Источник всегда будет объектом, поэтому в вашем случае не стоит об этом беспокоиться.

4 голосов
/ 28 марта 2012

Все это означает, что ваш запрос ничего не соответствует. Предположительно Allowncedtl.tvrid - это идентификатор, который не совпадает с чем-либо в базе данных. Вы не должны предполагать, что SingleOrDefault вернет ненулевое значение. Используйте SingleOrDefault только тогда, когда вы ожидаете , что не может быть никаких значений - и справьтесь с этим. Если невозможность найти значение указывает на ошибку, вам следует использовать Single (или, возможно, First).

Мы ничего не можем сказать о том, что является лежащей в основе причиной вашей ошибки - вы должны записать, какой идентификатор вы искали, выяснить почему вы искали это, а затем проверьте его в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...