我们说我有一个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()
方法是无效的呢?如何在查询中包含该调用而无需修改?
答案 0 :(得分:4)
简短的回答是:你做不到。但是你可以将它包装在一个确实返回内容的委托中。
...
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;
}
但当然这只适用于一个参数 - 你必须为你想支持的每个参数数量设置一个单独的方法。