无法将类型 'MongoDB.Driver.DeleteResult' 隐式转换为 'T'

Cannot implicitly convert type 'MongoDB.Driver.DeleteResult' to 'T'

我在我的 MVC 项目中使用 MongoDB 并正在创建一个实用函数,我可以使用它来删除数据库中的记录。

我正在使用:

方法是通过记录我要删除的内容。 我通过要删除的已传递记录的 id 过滤数据库中的所有记录。 找到它我想删除它。 我的方法

public virtual async Task<T> Delete(EmailBlastDocument input)
        {
            var filter = Builders<T>.Filter.Eq(p => p.Id, input.Id);
            
            var collection = DocumentContext.DocumentClient.GetDatabase(DatabaseName).GetCollection<T>(CollectionName);

            return await collection.DeleteOneAsync(filter);

        }

但是它在编译时突出显示了错误

Cannot implicitly convert type 'MongoDB.Driver.DeleteResult' to 'T'

如何修复此函数以将删除记录的结果正确地return发送给调用者?以及如何正确删除 mongoDB

中的记录

我已经创建了以示例为例的更新方法

public virtual async Task<T> Update(T input)
        {
            var collection = DocumentContext.DocumentClient.GetDatabase(DatabaseName).GetCollection<T>(CollectionName);
            try
            {
                await collection.ReplaceOneAsync(a => a.Id == input.Id, input);
            }
            catch (MongoWriteException ex)
            {
                switch (ex.WriteError.Category)
                {
                    case ServerErrorCategory.ExecutionTimeout:
                        throw new TimeoutException();
                    default:
                        throw new CirrusDocumentGeneralException();
                }
            }
            return input;
        }

我仍然不是 100% 清楚您要在这里做什么。我也不确定为什么该方法接受 EmailBlastDocument 而不是 T。我假设它应该是 T.

如果您想将其更改为与 Update 类似的工作方式,您可以将其更改为:

public virtual async Task<T> Delete(T input)
{
    var filter = Builders<T>.Filter.Eq(p => p.Id, input.Id);
    
    var collection = DocumentContext.DocumentClient.GetDatabase(DatabaseName).GetCollection<T>(CollectionName);

    await collection.DeleteOneAsync(filter); // do the delete
    return input; // return the input
}

这将 return 输入文档作为删除的结果。请注意,input 文档可能与数据库中的最后一个值不同。

如果你想return文件的绝对最新版本,可以使用FindOneAndDeleteAsync:

public virtual async Task<T> Delete(T input)
{
    var filter = Builders<T>.Filter.Eq(p => p.Id, input.Id);

    var collection = DocumentContext.DocumentClient.GetDatabase(DatabaseName).GetCollection<T>(CollectionName);

    return await collection.FindOneAndDeleteAsync(filter);
}

这将 return 文档,因为它在数据库中被删除之前。