C# Linq请求中的Where语句
我尝试执行此Linq请求:C# Linq请求中的Where语句,c#,linq,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")
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.Fieldnamespace_name.ToLowerInvariant.ContainesNamespaceName.ToLowerInvariant
在where子句中
如果有人能帮我,那就太好了试试看
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.Fieldnamespace\u 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种可能性:
没有磁场
字段名称空间名称
返回null,因为没有字段-
有一个领域,但是
Fieldnamespace_name.ToLowerInvariant
返回null,因为名称空间\u name中的值为null,所以ToLowerInvariant也返回null,这将破坏包含。可以使用null合并a??b表示a,除非a为null,然后使用空字符串合并b。