原文在此
原linq语句:
var res = employees
.Where(e => e.Gender == "Male")
.Take(3)
.Where(e => e.Salary > avgSalary)
.OrderBy(e => e.Age);
扩展方法:
public static IEnumerable<T> LogLINQ<T>(this IEnumerable<T> enumerable, string logName, Func<T, string> printMethod)
{
#if DEBUG
int count = 0;
foreach (var item in enumerable)
{
if (printMethod != null)
{
Debug.WriteLine($"{logName}|item {count} = {printMethod(item)}");
}
count++;
yield return item;
}
Debug.WriteLine($"{logName}|count = {count}");
#else
return enumerable;
#endif
}
使用方法
var res = employees
.LogLINQ("source", e => e.Name)
.Where(e => e.Gender == "Male")
.LogLINQ("logWhere", e => e.Name)
.Take(3)
.LogLINQ("logTake", e => e.Name)
.Where(e => e.Salary > avgSalary)
.LogLINQ("logWhere2", e => e.Name)
.OrderBy(e => e.Age);
说明和解释:
LogLINQ
方法。它可以选择打印通过此操作的所有项目和总数。
logName
是每个输出的前缀,可以轻松查看编写它的查询步骤。我喜欢将其命名为之后操作相同的名称。
Fun<T,string>printMethod
允许打印给定项目的任何内容。在上面的示例中,我选择使用 e=>e.Name
打印员工的姓名,当为 null
时,除总数外,不会打印任何内容。
#if DEBUG
)。在发布模式下,它什么都不做。
lazy
特性。以下是查看单个操作结果的提示:将整个输出复制到 notepad++
。然后使用Ctrl+Shift+F(Find)并查找日志前缀(例如 logWhere2
)。在查找对话框,点击Find All in Current Document。这将仅显示与日志名称前缀匹配的行。