Linq请求中的where语句

时间:2011-10-22 09:50:07

标签: c# linq

我尝试执行此Linq请求:

var lqClassResult = from classItem in this.dataSet._class.AsEnumerable()
    join namespaceItem in this.dataSet._namespace.AsEnumerable()
    on classItem.Field<int>("namespace_id") equals namespaceItem.Field<int>("id")
    where classItem.Field<string>("class_name").ToLowerInvariant().Contains(className.ToLowerInvariant()) &&
          namespaceItem.Field<string("namespace_name").ToLowerInvariant().Contains(namespaceName.ToLowerInvariant())                                   
    orderby namespaceItem.Field<string>("namespace_name"),classItem.Field<string>("class_name")
    select new { 
         class_name = classItem.Field<string>("class_name"), 
         namespace_name = namespaceItem.Field<string>("namespace_name") 
    };

但是当我执行它时,Visual Studio因为这行而抛出一个NullReferenceException: where子句中的 namespaceItem.Field("namespace_name").ToLowerInvariant().Contains(namespaceName.ToLowerInvariant())

如果有人能帮助我,那就太棒了

3 个答案:

答案 0 :(得分:0)

尝试

on classItem.Field<int>("namespace_id") equals namespaceItem.Field<int>("id")  
let namespaceName = namespaceItem.Field<string("namespace_name")
where classItem.Field<string>("class_name").ToLowerInvariant().Contains(className.ToLowerInvariant()) && namespace != null && 
      namespace.ToLowerInvariant().Contains(namespaceName.ToLowerInvariant())                                     

答案 1 :(得分:0)

我会猜测 namespaceItem.Field("namespace_name")正在返回null。

这是该方法的有效返回值吗?如果没有,请检查您的基础代码。

如果 是有效的返回值,那么在调用ToLowerInvariant()之前需要检查null:

var lqClassResult = from classItem in this.dataSet._class.AsEnumerable()
    join namespaceItem in this.dataSet._namespace.AsEnumerable()
    on classItem.Field<int>("namespace_id") equals namespaceItem.Field<int>("id")
    where classItem.Field<string>("class_name").ToLowerInvariant().Contains(className.ToLowerInvariant()) &&
          namespaceItem.Field<string("namespace_name") ! =  null &&
          namespaceItem.Field<string("namespace_name").ToLowerInvariant().Contains(namespaceName.ToLowerInvariant())                                   
    orderby namespaceItem.Field<string>("namespace_name"),classItem.Field<string>("class_name")
    select new { 
         class_name = classItem.Field<string>("class_name"), 
         namespace_name = namespaceItem.Field<string>("namespace_name") 
    };

请注意额外的空检查:

      namespaceItem.Field<string("namespace_name") ! =  null &&

但是,这只是一个猜测:您需要确定空值的来源。

答案 2 :(得分:0)

2种可能性:

  • 没有字段
  

字段( “namespace_name”)

返回null,因为没有字段 -

  • 有一个字段,但

字段( “namespace_name”)。ToLowerInvariant()。

返回null,因为namespace_name中的VALUE为null,因此ToLowerInvariant也返回null,这将使包含内容爆炸。