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

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

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

“序列不包含任何元素”基本上是LINQ的方式告诉您,您正试图从没有任何内容的列表中引用元素。 因此调用.First().Single()东西找不到任何东西,因此错误。

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

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

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

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

使用它并检查引用为null

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

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

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

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