如何用查询语法将Void方法引入LINQ查询
本文关键字:查询 方法 LINQ 何用 语法 Void | 更新日期: 2023-09-27 18:01:44
假设我有一个LINQ查询,我必须保持查询语法:
foreach (var productId in (from batchOrder in batchOrders
let outputFileName = GetUniqueFileName(batchOrder)
let ssisResult = SendToSsis(productId, outputFileName)
where ssisResult == 0))
{
// Does something here
}
我需要在不离开查询边界的情况下引入一个新的操作调用。如果我调用的方法返回一个布尔值,我可以用let
关键字添加它:
foreach (var productId in (from batchOrder in batchOrders
let outputFileName = GetUniqueFileName(batchOrder)
let ssisResult = SendToSsis(productId, outputFileName)
// The next line is the new call
let trackingFiles = OutputTrackingFiles(batchOrder)
where ssisResult == 0))
{
// Does something here
}
但是如果OutputTrackingFiles()
方法是空的呢?如何在不修改的情况下在查询中包含该调用?
简短的回答是:你不能。但你可以把它包装在一个委托中让它返回一些东西。
...
let trackingFiles = new Func<bool>(() => { OutputTrackingFiles(batchOrder); return true; })()
...
如果你经常这样做,一个助手方法将使它更简洁:
...
let trackingFiles = Execute(() => OutputTrackingFiles(batchOrder))
...
private static bool Execute(Action action)
{
action();
return true;
}
或:
...
let trackingFiles = Execute(OutputTrackingFiles, batchOrder)
...
private static bool Execute<T>(Action<T> action, T arg)
{
action(arg);
return true;
}
但是这当然只适用于一个参数——你必须为你想要支持的每个参数数量有一个单独的方法