我有一个这样的方法:
var Start = await cosmosManager.GetDocumentItemsForLogStartAsync();
public async Task<List<LogStart>> GetDocumentItemsForLogStartAsync()
{
List<LogStart> Items2 = new List<LogStart>();
try
{
collectionLink = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
var query = client.CreateDocumentQuery<LogStart>(collectionLink).Where(x => x.Activity == "Start").AsDocumentQuery();
while (query.HasMoreResults)
{
var retrivedData2 = await query.ExecuteNextAsync<LogStart>();
Items2.AddRange(retrivedData2);
}
}
catch (DocumentClientException ex)
{
Debug.WriteLine("Error: ", ex.Message);
}
return Items2;
}
我想做的就是调用这样的方法:
var Start = await cosmosManager.GetDocumentItemsForLogAsync(LogStart, "Start");
var Views = await cosmosManager.GetDocumentItemsForLogAsync(LogViews, "Views");
var Feedback = await cosmosManager.GetDocumentItemsForLogAsync(LogFeedback, "Feedback");
其中LogStart,LogViews和LogFeedback都是类。
有没有一种方法可以更改我的方法,这样可以避免我不得不创建三种不同的方法?
使用C#泛型。
此外,在C#中的局部变量应该是camelCased
没有PascalCased
。
我假设您的Where
子句是特定于类型的,这意味着您需要将其移至参数。我认为这需要一个Expression<>
overFunc<>
而不是一个pure Func<>
(取决于您使用的是IQueryable<T>
还是IEnumerable<T>
)。
public async Task<List<T> GetDocumentItemsAsync<T>( Expression<Func<T,Boolean>> predicate )
{
List<T> list = new List<T>();
try
{
collectionLink = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
var query = client.CreateDocumentQuery<T>(collectionLink)
.Where( predicate )
.AsDocumentQuery();
while (query.HasMoreResults)
{
var retrivedData2 = await query.ExecuteNextAsync<T>();
list.AddRange(retrivedData2);
}
}
catch (DocumentClientException ex)
{
Debug.WriteLine("Error: ", ex.Message);
}
return list;
}
像这样使用:
var start = await cosmosManager.GetDocumentItemsAsync<LogStart>( x => x.Activity == "Start" );
var views = await cosmosManager.GetDocumentItemsAsync<LogViews>( x => x.Activity == "Views" );
var feedback = await cosmosManager.GetDocumentItemsAsync<LogFeedback>( x => x.Activity == "Feedback" );
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句