我最近将 .NET 3.5 Web 应用程序升级到 .NET 4.5。在应用程序的一部分中,我们构建了一个谓词来查询缓存中的数据并添加过滤器(附加到谓词)。有时我可能会使用不同的数据(itemCode = 123 AND itemCode = 456)多次添加相同的 WHERE。在 3.5 中这有效,而在 4.5 中则无效(实际上似乎它也不应该在任何一个中有效,我只是想知道发生了什么变化)。当我检查谓词时(构建它的代码在转换为 4.5 时没有改变),这是我看到的区别:
{f => ((((True && Invoke(e => ((Convert(e.IsItem) != null) && (e.IsItem = value(AvailableItems+<>c__DisplayClass26).nei)),f)) && Invoke(e => ((e.VendorNumber != null) && (e.VendorNumber = value(AvailableItems+<>c__DisplayClass0).filter.ColumnValue)),f)) && Invoke(e => ((e.VendorNumber != null) && (e.VendorNumber = value(AvailableItems+<>c__DisplayClass0).filter.ColumnValue)),f)) && Invoke(e => ((e.VendorNumber != null) && (e.VendorNumber = value(AvailableItems+<>c__DisplayClass0).filter.ColumnValue)),f))}
{f => ((((True AndAlso Invoke(e => ((Convert(e.IsItem) != null) AndAlso (e.IsItem == value(AvailableItems+<>c__DisplayClass24).nei)), f)) AndAlso Invoke(e => ((e.VendorNumber != null) AndAlso (e.VendorNumber == value(AvailableItems+<>c__DisplayClass0).filter.ColumnValue)), f)) AndAlso Invoke(e => ((e.VendorNumber != null) AndAlso (e.VendorNumber == value(AvailableItems+<>c__DisplayClass0).filter.ColumnValue)), f)) AndAlso Invoke(e => ((e.VendorNumber != null) AndAlso (e.VendorNumber == value(AvailableItems+<>c__DisplayClass0).filter.ColumnValue)), f))}
谁能向我解释发生了什么?AndAlso 的工作方式与 && 不同吗?