我已经使用linq但只搜索id并且它运行良好
var obj = (from VAR in db.infos
where VAR.id == 22
select new
{
title = VAR.title,
}).SingleOrDefault();
Label2.Text = obj.title.Trim();
如果我尝试按位置搜索,则会收到错误
var obj = (from VAR in db.infos
where VAR.location.Trim() == "Lim"
select new
{
title = VAR.title.Trim(),
}).SingleOrDefault();
SearchJob.Items.Add(obj.title.Trim());
Label2.Text = obj.title;
label2行有错误
对象引用未设置为对象的实例。
我该如何解决?
if (obj.title != null)
{
SearchJob.Items.Add(obj.title.Trim());
Label2.Text = obj.title;
}
对象引用未设置为对象的实例。
解
将SingleOrDefault()
更改为FirstOrDefault()
答案 0 :(得分:1)
我认为查询中出现了错误
在第一个查询中,您有来源db.infos
第二,你有来源db.jobinfos
来源已更改
如果我们将空文本分配给它将显示,看起来obj.title
不存在,或者由于错误的来源而导致您的查询出错。
obj没有返回标题字段。通过调试来检查obj。
答案 1 :(得分:1)
你在那里做了一些讨厌的事情,非常糟糕的习惯。例如:
var obj = (from VAR in db.infos
where VAR.location.Trim() == "Lim"
select new
{
title = VAR.title.Trim(),
}).SingleOrDefault();
SearchJob.Items.Add(obj.title.Trim());
Label2.Text = obj.title;
是胡说八道!我告诉你原因:
在将数据插入数据库之前,请务必检查数据,而不是之后。你以这种方式创造了许多不必要的开销,这可以完全避免。之前修剪数据,从不修改数据。
接下来的事情 - 您只需要一个字符串值,但您创建了一个匿名对象。为什么?这样做:
string title = (from o in db.infos
where o.location == "Lim"
select o.title).SingleOrDefault();
如果您期望单个结果或没有结果,请使用SingleOrDefault
。但是,如果您希望获得多个结果并且只想要第一个结果,请使用FirstOrDefault
。
如您所见,我使用o
代替VAR
。这是真的,它并不重要,但是,使用与保留字(var
)之一非常相似的单词绝不是一个好主意。
如果您收到异常Object reference not set to an instance of an object.
,则表示您的查询返回null并且您尝试访问不存在的对象。如果您的查询在某些时候可能返回null,请在访问成员时始终检查null!
修改强>
if ( obj.title != null )
也很糟糕,因为你需要检查对象本身是否为null!
if (obj != null)
如果你真的想用你糟糕的方法。
答案 2 :(得分:0)
尝试跳过异常:)
public static class LINQException {
public static void TryExample() {
var LsWithEx = from p in Enumerable.Range(0, 10) select int.Parse("dsfksdj");
var LsSkipEx = (from p in Enumerable.Range(0, 10) select int.Parse("dsfksdj")).SkipExceptions();
}
public static IEnumerable<T> SkipExceptions<T>(this IEnumerable<T> values)
{
using (var enumerator = values.GetEnumerator())
{
bool next = true;
while (next)
{
try
{ next = enumerator.MoveNext();}
catch
{ continue;}
if (next) yield return enumerator.Current;
}
}
}
}
var obj = (from VAR in db.infos
where VAR.location.Trim() == "Lim"
select new
{
title = VAR.title.Trim(),
}).SkipExce.SingleOrDefault();