假设我需要将对象与存储在我的数据库中名为Indexes的表中的其他对象进行比较。
我需要通过对象的X
属性进行比较,该属性是一个字符串,但它可能是null
。
我还必须在比较之前修剪compareObject的X属性。 我试着做以下事情:
List<Guid> Ids = DataContext.Indexes.Where(ci =>
(comparedObject.X != null && ci.X != null ?
ci.X == comparedObject.X.Trim() :
(ci.X == null || ci.X == string.Empty) && (comparedObject.X == null || comparedObject.X == string.Empty))).Select(ci => ci.Id).ToList();
即使comparedObjects.X
为null
,它仍会为comparedObject.X.Trim()
表达式抛出空引用异常。
我认为这是由于linq转换而发生的?
是否有一种更漂亮的方法来修剪X
属性,而不必为comparedObject.X
分配一个空字符串,以防它在查询之前为空?
编辑:
我想详细说明 - 这里的查询简化了,我也在比较其他6个属性。我想将此保留在1个查询中,而不是单独与仅X
属性不同的2个查询分开。
在查询之外修剪是我当前的解决方案,我希望有一个语句中的解决方案,以防有任何:)
谢谢!
答案 0 :(得分:1)
即使compareObjects.X为null,它仍会抛出null compareObject.X.Trim()表达式的引用异常。
你最好在linq语句之前进行空检查
if(comparedObject !=null && !string.IsNullorEmpty(comparedObject.X))
{
// your code goes here
}
代码
(ci.X == null || ci.X == string.Empty) && (comparedObject.X == null || comparedObject.X == string.Empty)
可以改为
string.IsNullorEmpty(ci.X) && string.IsNullorEmpty(comparedObject.X)
我会改变代码如下
List<Guid> Ids = DataContext.Indexes.Where(ci =>
(string.IsNullorEmpty(ci.X) && string.IsNullorEmpty(comparedObject.X)) || ci.X == comparedObject.X.Trim())
.Select(ci => ci.Id).ToList();
答案 1 :(得分:0)
可能是你可以尝试:
List<Guid> Ids = DataContext.Indexes.Where(ci =>ci.X != null ? ci.X == comparedObject.X==null?"":comparedObject.X.Trim() :
(comparedObject.X == null || comparedObject.X == null)))
.Select(ci => ci.Id).ToList();