2

假设我需要将一个对象与存储在我的数据库中名为 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 个查询分开。在查询之外进行修剪是我目前的解决方案,我希望有一个声明内的解决方案,以防万一:)

谢谢!

4

2 回答 2

1

即使 compareObjects.X 为 null,它仍然会为 compareObject.X.Trim() 表达式引发 null 引用异常。

你最好在 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();
于 2013-07-22T09:13:02.563 回答
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();
于 2013-07-22T09:23:14.810 回答