正确的查询linq

时间:2012-08-25 07:56:32

标签: c# linq

我已经使用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()

3 个答案:

答案 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();