【问题标题】:MongoDB C# Driver Find not throwing System.FormatException Deserialization error and runs successfullyMongoDB C# Driver Find not throwing System.FormatException 反序列化错误并成功运行
【发布时间】:2019-02-20 19:24:05
【问题描述】:

我在我的 .net core 2.0 应用程序中使用最新的 c# mongo 驱动程序。我的代码中有这个错误

无法从 BsonType 'Int64' 反序列化 'String'。.

但是 mongo 查询没有抛出任何异常。这是我存储库中的 find 方法。

        /// <summary>
        /// find entities
        /// </summary>
        /// <param name="filter">expression filter</param>
        /// <returns>collection of entity</returns>
        public virtual IEnumerable<T> Find(Expression<Func<T, bool>> filter)
        {
            return Collection.Find(filter).ToEnumerable();
        }

        /// <summary>
        /// find entities
        /// </summary>
        /// <param name="filter">expression filter</param>
        /// <returns>collection of entity</returns>
        public Task<IEnumerable<T>> FindAsync(Expression<Func<T, bool>> filter)
        {
            return Task.Run(() => Find(filter));
        }

这是处理程序代码

public async Task<object> Handle(GetQuestionBySurveyIdAndCodeQuery request, CancellationToken cancellationToken)
    {
      var result = await _context.Question.FindAsync(x => x.SurveyId.Equals(request.SurveyId));
      return result;
    }

代码运行成功,但在此查询返回的数据中显示错误。

我想抛出这个异常,以便我的框架可以处理它。他们的任何设置是否与此相关。

需要帮助。

谢谢

【问题讨论】:

  • 我知道这不能解决您的问题,但如果 QuestionEntity.Variables 属性是多态的,您可能会遇到这种情况stackoverflow.com/questions/18642693/…
  • 我希望抛出这个异常,以便 .net 代码框架可以处理当前我的 api 方法运行良好,因为它不应该是。
  • 调用result.ToList() 会触发它吗?反序列化单个查询结果似乎是一个问题。调用 ToList() 应该强制惰性可枚举立即评估所有结果。

标签: c# mongodb mongodb-query mongodb-.net-driver


【解决方案1】:

要从 MongoDB 驱动程序获取 FormatException,您需要从数据库中获取数据,而在您的代码中您只是构建一个查询。您正在使用的扩展方法.ToEnumerable() 没有访问数据库,因此此时您不会得到任何结果。它的文档says

将光标包装在一个可以枚举一次的 IEnumerable 中。

所以要枚举一个游标,你可以在上面运行foreachToList。否则它只是一个没有任何结果的数据库查询。要解决这个问题,您可以更改 Find 方法体:

public virtual IEnumerable<T> Find(Expression<Func<T, bool>> filter)
{
    return Collection.Find(filter).ToList();
}

【讨论】:

  • 我的其他查询正在使用相同的方法从数据库中获取数据
  • @GhazanfarKhan 我想说的是,您将使用该方法获取数据,但不会在您的存储库中枚举。根据您的帖子,它将被枚举:1)当您在调试器中扩展 Results View 时 2)当它被序列化(return Ok())时,我猜这不是您想要捕获异常的地方
  • 好的,谢谢,当我将 ToEnumerable 更改为 ToList() 时它起作用了。
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2017-05-26
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多