我正在尝试更新表中的单个记录,但是当我运行.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();
}
答案 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,找出为什么您正在寻找那,然后在数据库中检查它。