Linq请求中的Where语句

本文关键字:Where 语句 请求 Linq | 更新日期: 2023-09-27 18:12:17

我尝试执行这个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,因为这一行: namespaceItem.Field("namespace_name").ToLowerInvariant().Contains(namespaceName.ToLowerInvariant())
in where子句

如果有人能帮我就太好了

Linq请求中的Where语句

Try

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())                                     

猜测 namespaceItem.Field("namespace_name")返回null。

这是该方法的有效返回值吗?如果没有,则检查底层代码。

如果一个有效的返回值,那么你需要在调用ToLowerInvariant():

之前检查是否为空:
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") 
    };

注意额外的null检查:

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

但是,这只是一个猜测:您需要确定空值来自哪里。

两种可能性:

  • 没有字段

字段(namespace_name)

返回null,因为没有字段-

  • 有一个字段,但是

字段(namespace_name) .ToLowerInvariant()。

返回null,因为namespace_name中的VALUE是null,所以ToLowerInvariant也返回null,这将吹掉包含