无法将类型 'MongoDB.Driver.DeleteResult' 隐式转换为 'T'
Cannot implicitly convert type 'MongoDB.Driver.DeleteResult' to 'T'
我在我的 MVC 项目中使用 MongoDB 并正在创建一个实用函数,我可以使用它来删除数据库中的记录。
我正在使用:
- mongo C# 的数据库扩展
- C#(.net 4.6.1)
方法是通过记录我要删除的内容。
我通过要删除的已传递记录的 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 文档,因为它在数据库中被删除之前。
我在我的 MVC 项目中使用 MongoDB 并正在创建一个实用函数,我可以使用它来删除数据库中的记录。
我正在使用:
- mongo C# 的数据库扩展
- C#(.net 4.6.1)
方法是通过记录我要删除的内容。 我通过要删除的已传递记录的 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 文档,因为它在数据库中被删除之前。