LINQ查询问题,序列不包含任何元素

Nav*_*eed 7 c# linq asp.net entity-framework-4

我正在尝试更新表中的单个记录,但是当我运行时.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();


    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 20

查询不得返回任何数据.在SQL数据库上运行探查器以查看正在执行的物理查询,并尝试对数据库手动执行它以查看数据的外观.您可能必须调整查询(或数据)以获得您正在寻找的结果.

"序列不包含任何元素"基本上是LINQ的方式告诉你,你正试图从没有任何东西的列表中引用一个元素.所以调用类似.First().Single()无法找到的东西,因此错误.

当您将调用更改为类似.FirstOrDefault().SingleOrDefault()之后,它将使用该类型的"默认"值,对于引用类型,默认值为null.因此,如果您设置了某些内容null然后尝试在其上调用方法,那么您将获得object reference not set to an instance of an object.


Jon*_*eet 6

这意味着您的查询不匹配任何内容。大概Allowncedtl.tvrid是一个与数据库中任何内容都不匹配的 ID。您不应该假设它将SingleOrDefault返回非空值。SingleOrDefault仅当您预计可能没有值时才使用- 并应对这种情况。如果找不到值表明存在错误,您应该使用Single(或者也许First)。

我们无法告诉您错误的根本原因是什么- 您应该记录您正在查找的 ID,找出您查找该ID 的原因,然后在数据库中检查它。


Adr*_*ode 5

当list(查询)中没有元素或者有多个元素时,Single方法抛出此异常.

当列表中有多个元素时,SingleOrDefault方法会抛出异常.没有元素时返回null.

FirstOrDefault方法在列表或NULL返回的第一个项目.没有例外.

使用它并检查引用为null

if (ta != null )
   {
      ta.status = Allowncedtl.status; 
      ce.SaveChanges()
   }
Run Code Online (Sandbox Code Playgroud)

源将永远是一个对象,所以在你的情况下不用担心它.