我是一个SQL开发人员,所以Linq(和C#一般)对我来说有点陌生,但我有一个简单的foreach循环,我认为Linq查询可能会更好.即使手头的问题不是特别困难,如果没有别的东西,这将是一个有用的东西.这是我的代码:
bool fireAgain = true;
foreach (var connMan in Dts.Connections)
{
Dts.Events.FireInformation
( 0
, ""
, String.Format("Connection Manager {0} has connection string {1}"
, connMan.Name
, connMan.ConnectionString)
, ""
, 0
, ref fireAgain
);
}
Run Code Online (Sandbox Code Playgroud)
我可以搞清楚:
from connMan in Dts.Connections select connMan
Run Code Online (Sandbox Code Playgroud)
很容易,但我如何将我的connMan传递给我对FireInformation方法的调用呢?
我不建议尝试将其转换为Linq,因为Linq旨在用于函数式编程,而非命令式.如果你想将它与SQL进行比较,那么它将没有DML.
Dts.Events.FireInformation似乎没有返回您可以选择的值.它可能触发事件或其他东西,它也使用ref参数.这段代码看起来根本不像是一个查询,我认为它不应该强制成一个.一foreach环就是在这种情况下完全正常的,因为你实际上在做里面工作,而不是查询数据(这是LINQ是什么).
如果您需要根据某些条件过滤集合,如果您需要加入单独的集合或类似的东西,那么Linq可能是一个更好的工具.
通常,LINQ将用于查询信息.在这种情况下,您还要查询信息.
你可以做的是以下内容:
Dts.Connections.ForEach((conMan) =>
{
Dts.Events.FireInformation(0, "", String.Format("Connection Manager {0} has connection string {1}", connMan.Name, connMan.ConnectionString), "", 0, ref fireAgain);
}
Run Code Online (Sandbox Code Playgroud)
也就是说,如果Dts.Connections是List,否则你不能这样做.(无法从您的问题中判断出它是IEnumerable还是List)
解决方法是创建扩展方法并使用它.像这样:
public void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach(T item in source)
{
action(item);
}
}
Run Code Online (Sandbox Code Playgroud)
之后,您可以在源代码上使用ForEach方法,如示例所示.