3

我是一名 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
        );
}

我可以弄清楚:

from connMan in Dts.Connections select connMan

很容易,但是我如何将我的 connMan 传递给我对 FireInformation 方法的调用?

4

3 回答 3

7

我不建议尝试将其转换为 Linq,因为 Linq 旨在用于函数式编程,而不是命令式编程。如果您想将其与 SQL 进行比较,那么它将没有 DML。

Dts.Events.FireInformation似乎没有返回您可以选择的值。它可能会触发一个事件或其他东西,它还使用一个ref参数。那段代码看起来根本不像一个查询,我认为它不应该被强加给一个。在foreach这种情况下,循环非常好,因为您实际上是在其中工作而不是查询数据(这是 linq 的用途)。

如果您需要根据某些条件过滤集合,如果您需要加入单独的集合或类似的东西,那么 Linq 可能是一个更好的工具。

于 2013-04-15T12:08:32.390 回答
5

通常 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);
}

也就是说,如果 Dts.Connections 是一个 List,否则你不能这样做。(无法从您的问题中判断它是 IEnumerable 还是 List)

一种解决方法是创建一个扩展方法并使用它。像这样:

public void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach(T item in source)
    {
        action(item);
    }
}

之后,您可以在源上使用 ForEach 方法,如示例所示。

于 2013-04-15T12:07:13.943 回答
2
Dts.Connections
   .ForEach(connMan => Dts.Events.FireInformation(0, "", String.Format("Connection Manager {0} has connection string {1}", connMan.Name, connMan.ConnectionString), "", 0, ref fireAgain));

如果 Connections 不是 IEnumerable,则将第一行更改为 ;

Dts.Connections.ToList()
于 2013-04-15T12:06:25.397 回答