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

C# 如何取消对LINQ中可能为空的字符串的引用,c#,string,linq,dereference,C#,String,Linq,Dereference,假设我需要将一个对象与数据库中名为index的表中存储的其他对象进行比较。 我需要通过对象的X属性进行比较,该属性是一个字符串,但它可能是null 在比较之前,我还必须修剪comparedObject的X属性。 我试着做到以下几点: List<Guid> Ids = DataContext.Indexes.Where(ci => (comparedObject.X != null && ci.X != null ?

假设我需要将一个对象与数据库中名为index的表中存储的其他对象进行比较。 我需要通过对象的
X
属性进行比较,该属性是一个字符串,但它可能是
null

在比较之前,我还必须修剪comparedObject的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();
List id=DataContext.index.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))。选择(ci=>ci.Id).ToList();
即使
comparedObjects.X
null
它仍然会为
comparedObject.X.Trim()
表达式抛出null引用异常

我假设这是由于linq转换引起的

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

编辑: 我想详细说明一下-为了简单起见,这里减少了这个查询,我还比较了其他6个属性。我希望将其保留在1个查询中,而不是单独将
X
属性不同的2个查询分开。 在查询之外进行修剪是我当前的解决方案,我希望有一个语句内解决方案,以防出现:)

谢谢

即使comparedObjects.X为null,它仍然抛出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();
List id=DataContext.index.Where(ci=>
(string.IsNullorEmpty(ci.X)和&string.IsNullorEmpty(comparedObject.X))| | ci.X==comparedObject.X.Trim()
.Select(ci=>ci.Id).ToList();
可能有问题,您可以尝试:

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();
List id=DataContext.index.Where(ci=>ci.X!=null?ci.X==comparedObject.X==null?”:comparedObject.X.Trim():
(comparedObject.X==null | | comparedObject.X==null)))
.Select(ci=>ci.Id).ToList();

您想在if和else if中选择什么?尝试使用string.IsNullOrWhiteSpace()-通过查看查询,似乎不应该执行trim()语句。稍后我仍然需要比较LINQ语句中的X属性(trimmed)。因此,我需要在声明之前对其进行修剪,并试图找到一个更优雅的解决方案:)为了简单起见,我还比较了其他属性(大约6个)。我希望防止查询重复,因为我必须在else子句的语句中执行相同的查询,而不使用X属性。这基本上就是我要做的,但由于它位于LINQ查询中,.Trim()仍在执行,并且实现了空引用:)