如何用查询语法将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()方法是空的呢?如何在不修改的情况下在查询中包含该调用?

如何用查询语法将Void方法引入LINQ查询

简短的回答是:你不能。但你可以把它包装在一个委托中让它返回一些东西。

...
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;
}

但是这当然只适用于一个参数——你必须为你想要支持的每个参数数量有一个单独的方法