如何取消引用LINQ中可能为null的字符串

时间:2013-07-22 08:50:26

标签: c# string linq dereference

假设我需要将对象与存储在我的数据库中名为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.Xnull,它仍会为comparedObject.X.Trim()表达式抛出空引用异常。

我认为这是由于linq转换而发生的?

是否有一种更漂亮的方法来修剪X属性,而不必为comparedObject.X分配一个空字符串,以防它在查询之前为空?

编辑: 我想详细说明 - 这里的查询简化了,我也在比较其他6个属性。我想将此保留在1个查询中,而不是单独与仅X属性不同的2个查询分开。 在查询之外修剪是我当前的解决方案,我希望有一个语句中的解决方案,以防有任何:)

谢谢!

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