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

Chr*_*uer 1 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
}
Run Code Online (Sandbox Code Playgroud)

而且,我需要引入一个新的操作调用,而又不会超出查询范围。如果我正在调用的方法返回一个布尔值,则可以使用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
}
Run Code Online (Sandbox Code Playgroud)

但是,如果该OutputTrackingFiles()方法无效,该怎么办?如何在查询中包含该调用,而无需进行修改?

Mic*_*ter 5

简短的答案是:您不能。但是您可以将其包装在确实返回某些内容的委托中。

...
let trackingFiles = new Func<bool>(() => { OutputTrackingFiles(batchOrder); return true; })()
...
Run Code Online (Sandbox Code Playgroud)

如果您经常执行此操作,则辅助方法将使其更加简洁:

...
let trackingFiles = Execute(() => OutputTrackingFiles(batchOrder))
...

private static bool Execute(Action action)
{
    action();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

要么:

...
let trackingFiles = Execute(OutputTrackingFiles, batchOrder)
...

private static bool Execute<T>(Action<T> action, T arg)
{
    action(arg);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但是,当然,这仅适用于一个参数-您必须为要支持的每个参数数量都有一个单独的方法。

  • 另外:我同意关于OP的所有评论。将状态更改操作放在LINQ中通常不是一个好主意(但是很诱人!)。 (2认同)