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

时间:2012-03-28 12:55:01

标签: c# asp.net linq 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();


    }

3 个答案:

答案 0 :(得分:20)

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

“序列不包含任何元素”基本上是LINQ的方式告诉你,你正在尝试从没有任何内容的列表中引用一个元素。因此,调用.First().Single()之类的内容无法找到任何内容,因此错误。

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

答案 1 :(得分:5)

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

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

FirstOrDefault方法返回列表中的第一项或null。没有例外。

使用它并检查引用为null

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

源始终是一个对象,所以在你的情况下不用担心它。

答案 2 :(得分:4)

这意味着您的查询不匹配任何内容。据推测,Allowncedtl.tvrid是一个与数据库中的任何内容都不匹配的ID。 不应该假设SingleOrDefault将返回非空值。只有在期待可能没有值时才使用SingleOrDefault - 并应对此问题。如果未能找到值表示存在错误,则应使用Single(或者First)代替。

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