如何使用查询语法将无效方法引入LINQ查询

时间:2014-05-05 22:17:54

标签: c# linq

我们说我有一个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()方法是无效的呢?如何在查询中包含该调用而无需修改?

1 个答案:

答案 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;
}

但当然这只适用于一个参数 - 你必须为你想支持的每个参数数量设置一个单独的方法。