这个C#条件代码有什么问题?

时间:2009-08-08 00:48:09

标签: c# entity-framework

我正在使用ADO.NET Entity框架来连接数据库并获取数据。我想如果对象中没有数据,如果它已满,它将写入“EMPTY FIELD”,而不是从db写入listview coloumn数据。当objectcontext中有一个null对象时,我收到'System.NullReferenceException'错误。返回“EMPTY ROW”字符串。

这是我的代码:

   using (ITSEntities arama = new ITSEntities())
            {
                var sql = "SELECT VALUE s_tesis FROM ITSEntities.TB_SAGLIK_TESIS AS s_tesis WHERE s_tesis.TESIS_AD like @p1";
                ObjectQuery<TB_SAGLIK_TESIS> sorgu = new ObjectQuery<TB_SAGLIK_TESIS>(sql, arama).Include("TB_IL").Include("TB_TESIS_TIPI").Include("TB_TESIS_TURU");
                sorgu.Parameters.Add(new ObjectParameter("p1", String.Format("{0}%", btnAra.Text)));

                                   listTesis.Items.Clear();

                foreach (var item in sorgu)
                {

                    ListViewItem listitem = new ListViewItem { Text = item.KODU.ToString() };
                    listitem.SubItems.Add(item.TESIS_AD);
                    listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_IL.ADI) ? "EMPTY ROW" : item.TB_IL.ADI);
                    listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_TESIS_TIPI.TIP_AD) ? "EMPTY ROW" : item.TB_TESIS_TIPI.TIP_AD);
                    listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_TESIS_TURU.TESIS_TURU) ? "EMPTY ROW" :item.TB_TESIS_TURU.TESIS_TURU);
                    listTesis.Items.Add(listitem);
                }
            }
        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.InnerException.ToString());
        }

3 个答案:

答案 0 :(得分:1)

我不知道EF,但您在以下行中取消引用了2个对象:

ListViewItem listitem = new ListViewItem { Text = item.KODU.ToString() };
listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_IL.ADI) ? "EMPTY ROW" : item.TB_IL.ADI);
listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_TESIS_TIPI.TIP_AD) ? "EMPTY ROW" : item.TB_TESIS_TIPI.TIP_AD);
listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_TESIS_TURU.TESIS_TURU

如果容器对象(KODUTB_ILTB_TESIS_TIPI。或TB_TESIS_TURU)永远为null,那么您将获得NullReferenceException。

我的 guess 是这些是表名,有些行没有对应的JOIN表。无论如何,您可能需要将其重写为:

ListViewItem listitem = new ListViewItem { Text = (item.KODU ?? "").ToString() };
listitem.SubItems.Add(
    (item.TB_TL == null || String.IsNullOrEmpty(item.TB_IL.ADI)) 
    ? "EMPTY ROW" : item.TB_IL.ADI
);

为了使它更清洁,方法:

string EmptyRowIfNull<T>(T o, Func<T, string> p) {
   string s;
   if (o != null) {
       s = p(o);
   }
   return string.IsNullOrEmpty(s) ? "EMPTY ROW" : s;
}

listitem.SubItems.Add(EmptyRowIfNull(item.TB_IL, t => t.ADI));
listitem.SubItems.Add(EmptyRowIfNull(item.TB_TESIS_TIPI, t => t.TIP_AD));
listitem.SubItems.Add(EmptyRowIfNull(item.TB_TESIS_TURU, t => t.TESIS_TURU));

答案 1 :(得分:0)

您可能想尝试item.attr.IsNull()

- 我相信强制转换为字符串会导致它在IsNullOrEmpty测试之前将该项标记为null。

答案 2 :(得分:0)

我没有使用实体框架。但是,当SQL查询没有返回任何行时,你可以枚举“sorgu”吗?

要测试它,你可以在try / catch中包装foreach并捕获NullReferenceException。有些人会使用这个NullReferenceException catch来设置你正在做的事情,但我不推荐它。