首页 > 解决方案 > MongoDB C# Driver Find not throwing System.FormatException 反序列化错误并成功运行

问题描述

我在我的 .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;
    }

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

在此处输入图像描述

在此处输入图像描述

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

需要帮忙。

谢谢

标签: c#mongodbmongodb-querymongodb-.net-driver

解决方案


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

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

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

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

推荐阅读