具有Linq表达式的IQueryable导致NullReferenceException

时间:2017-07-07 20:54:50

标签: c# linq lambda

以下函数导致NullReferenceException,因为它引用了m.tags,它尚未在JSON对象中声明。这是故意的。我需要查询没有现有tags对象的所有JSON对象。

SelectNext

TweetModel tweet = client
    .CreateDocumentQuery<TweetModel>( UriFactory.CreateDocumentCollectionUri( databaseName, collectionName), queryOptions )
    .Where( m => m.tags == null )
    .ToList()
    .FirstOrDefault();

示例文档

{
  "timestamp": "2017-07-05T19:31:18.918Z",
  "topic": "Trump",
  "score": "1",
  "sentiment": "positive",
  "text": "@gjacquette @travi44 @WSJ Where did I say trump shouldn't hire a lawyer? I said the fact his lawyers are hiring law… ",
  "id": "882683325495816192",
  "retweet_count": 0,
  "time_zone": null,
  "lang": "en",
  "screen_name": "bernielove1969"
}

声明tags对象的空值可以解决异常,所以我确定这是问题,我只是不确定如何解决它。

在过去几个小时内,我尝试将m => m.tags == null修改为!(m => m.tags != null)但没有运气以及各种其他解决方案。欢迎提出建议。

2 个答案:

答案 0 :(得分:4)

改变这个:

.Where(m => m.tags == null)

到此:

.Where(m => m?.tags == null)

使用Null-conditional Operator,如果NullReferenceException没有引用某个对象,则不会点击m

<强>更新

处理IQueryable<T>查询时,lambda表达式转换为表达式树,表达式树不支持null条件运算符。因此,您可以改为.Where(m => m != null && m.tags == null)

答案 1 :(得分:0)

在黑暗中这是一个小小的镜头,但我想我会把它丢掉以防它有所帮助。听起来这不是m.tag为null的问题,但是m是动态创建的对象,可能根本没有tag属性。它并不是null / not-null,它甚至可能不在对象中作为属性或字段。

你有没有尝试过像这样的东西:

m.GetType().GetField("tag") == null  // or...
m.GetType().GetProperty("tag") == null

......只是尝试一下。