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

4

假设我需要将一个对象与存储在我的数据库中的名为Indexes的表中的其他对象进行比较。

我需要按照对象的X属性进行比较,该属性是一个字符串,但可能为null

在进行比较之前,我还需要对要比较的对象的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 分配为空字符串,以防它为 null ?

编辑:我想详细说明-这个查询为简单起见而减少了,我还要比较其他大约6个属性。我希望将其保留在1个查询中,而不是将其分成两个查询,仅在 X 属性上有所不同。 在查询之外修剪是我目前的解决方案,如果有任何 in-statement 的解决方案,那就太好了 :)

谢谢!


你想在if和else if中选择什么? - Ehsan
尝试使用string.IsNullOrWhiteSpace() - 通过查看查询,似乎不应执行trim()语句。 - Jash
2个回答

3
即使comparedObjects.X为null,它仍会对comparedObject.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();

我仍然需要在稍后的LINQ语句中比较X属性(已修剪)。因此,我需要在语句之前对其进行修剪,并且我正在寻找比那更优雅的解决方案 :) 我还要比较其他属性(大约有6个),为简单起见,我已将其删除。我希望防止重复查询,因为我将不得不执行相同的查询,但在else子句中不包括X属性在语句中。 - Omri Aharon

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

这基本上就是我正在做的事情,但由于它在 LINQ 查询内部,所以 .Trim() 仍然会被执行并且会出现空引用 :) - Omri Aharon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接