C# 错误地说;类型';T';必须是引用类型“;使用表达式<;Func<;T、 布尔值>&燃气轮机;方法中的谓词
我试图更改一个方法,使其接受C# 错误地说;类型';T';必须是引用类型“;使用表达式<;Func<;T、 布尔值>&燃气轮机;方法中的谓词,c#,C#,我试图更改一个方法,使其接受表达式谓词参数。但是当我这样做的时候,它给了我一个错误 这里有一个老方法: async static Task Delete() { var F = await cosmosManager.GetDocumentItemsAsync<LogF>( x => x.Activity == "F"); await cosmosManager.DeleteDocumentItemAsync(F[0]
表达式谓词
参数。但是当我这样做的时候,它给了我一个错误
这里有一个老方法:
async static Task Delete() {
var F = await cosmosManager.GetDocumentItemsAsync<LogF>(
x => x.Activity == "F");
await cosmosManager.DeleteDocumentItemAsync(F[0].Id);
}
此外,这仅适用于检索到的第一条记录[0]。如何更改它以使其删除所有记录?只需对类型参数应用与
GetDocumentItemsAsync
中相同的约束:
异步静态任务删除(表达式谓词),其中T:class
{
//照旧执行
}
这将确保Delete
方法中的T
适合GetDocumentItemsAsync
中的T
然后您将遇到一个问题,即属性Id
在T
中未知。您是否有指定该属性的基类或接口?如果是,请将其添加到约束中
此外,这仅适用于检索到的第一条记录[0]。我如何更改它以使其删除所有记录
您可以迭代所有结果,一次删除一个,或者如果Cosmos提供该功能,则使用批删除。(我看不到沿着这些线的任何东西。)
根据应用程序的不同,您可能希望对此进行并行处理,首先对每个项调用
DeleteDocumentItemAsync
,然后使用Task。当所有的等待所有生成的任务完成时。只需对类型参数应用与GetDocumentItemsAsync
中相同的约束:
异步静态任务删除(表达式谓词),其中T:class
{
//照旧执行
}
这将确保Delete
方法中的T
适合GetDocumentItemsAsync
中的T
然后您将遇到一个问题,即属性Id
在T
中未知。您是否有指定该属性的基类或接口?如果是,请将其添加到约束中
此外,这仅适用于检索到的第一条记录[0]。我如何更改它以使其删除所有记录
您可以迭代所有结果,一次删除一个,或者如果Cosmos提供该功能,则使用批删除。(我看不到沿着这些线的任何东西。)
根据应用程序的不同,您可能希望对此进行并行处理,首先对每个项目调用DeleteDocumentItemAsync
,然后使用Task.whalll
等待所有生成的任务完成
此外,这仅适用于检索到的第一条记录[0]。我如何更改它以使其删除所有记录
此代码显示为检索集合,但仅删除第一项:
var F = await cosmosManager.GetDocumentItemsAsync<T>(predicate);
await cosmosManager.DeleteDocumentItemAsync(F[0].Id);
var F=await cosmanager.GetDocumentItemsAsync(谓词);
等待Cosmanager.DeleteDocumentItemAsync(F[0].Id);
也许应该迭代集合:
var F = await cosmosManager.GetDocumentItemsAsync<T>(predicate);
foreach(var f in F)
await cosmosManager.DeleteDocumentItemAsync(f.Id);
var F=await cosmanager.GetDocumentItemsAsync(谓词);
foreach(变量f在f中)
等待Cosmanager.DeleteDocumentItemAsync(f.Id);
如果这是Azure CosmosDB,可能有一种方法可以加快速度,即不将所有记录拖到客户端,只获取Id并逐个删除。我不确定该为您的特定上下文提供什么建议,但我最近不得不实施一些措施,有选择地删除数百万Azure表存储记录—这是一种有用的资源—基本上利用了一种功能,可以将谓词发送到Azure进行评估。我不知道这是否适用于你的情况
如果只有少数记录需要删除,那么这种简单化的方法可能还可以;乔恩提到在所有的情况下,对于更多的项目,它肯定会更好。考虑到(如果你有大量的项目和需要保持UI响应),你可以在排队机制中标记删除项目和一些独立的后台进程,或者是某种类型的火灾和遗忘。这里有很多未知数
此外,这仅适用于检索到的第一条记录[0]。我如何更改它以使其删除所有记录
此代码显示为检索集合,但仅删除第一项:
var F = await cosmosManager.GetDocumentItemsAsync<T>(predicate);
await cosmosManager.DeleteDocumentItemAsync(F[0].Id);
var F=await cosmanager.GetDocumentItemsAsync(谓词);
等待Cosmanager.DeleteDocumentItemAsync(F[0].Id);
也许应该迭代集合:
var F = await cosmosManager.GetDocumentItemsAsync<T>(predicate);
foreach(var f in F)
await cosmosManager.DeleteDocumentItemAsync(f.Id);
var F=await cosmanager.GetDocumentItemsAsync(谓词);
foreach(变量f在f中)
等待Cosmanager.DeleteDocumentItemAsync(f.Id);
如果这是Azure CosmosDB,可能有一种方法可以加快速度,即不将所有记录拖到客户端,只获取Id并逐个删除。我不确定该为您的特定上下文提供什么建议,但我最近不得不实施一些措施,有选择地删除数百万Azure表存储记录—这是一种有用的资源—基本上利用了一种功能,可以将谓词发送到Azure进行评估。我不知道这是否适用于你的情况
如果只有少数记录需要删除,那么这种简单化的方法可能还可以;乔恩提到在所有的情况下,对于更多的项目,它肯定会更好。考虑到(如果你有大量的项目和需要保持UI响应),你可以在排队机制中标记删除项目和一些独立的后台进程,或者是某种类型的火灾和遗忘。这里有很多未知数
var F = await cosmosManager.GetDocumentItemsAsync<T>(predicate);
foreach(var f in F)
await cosmosManager.DeleteDocumentItemAsync(f.Id);