1

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

4

3 回答 3

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)

如果你真的想使用你的坏方法。

于 2012-08-25T08:23:08.170 回答
1

我认为错误发生在查询中

在第一个查询中,您有来源 db.infos

在第二个你有来源db.jobinfos

来源变了

如果我们为 Label 分配空文本,它将显示,它看起来obj.title不存在,或者由于错误的来源,您在查询中遇到错误。

obj 没有返回标题字段。通过调试检查obj。

于 2012-08-25T07:58:49.353 回答
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();
于 2012-08-25T08:59:53.063 回答