使用LINQ Where查询只获取一些ConfigurationManager.ConnectionStrings

Jer*_*oen 7 c# linq configurationmanager connection-string

我的目标是在控制台应用程序中Where对ConfigurationManager.ConnectionStrings集合使用LINQ 查询(假设添加了System.Configuration引用的新的.NET 4.5控制台应用程序,以及相应的using声明).

我开始用这个,这并没有工作:

var relevantSettings =
        ConfigurationManager.ConnectionStrings.Where(s => s.Name.StartsWith("Xyz"));
Run Code Online (Sandbox Code Playgroud)

它告诉我:

方法' IEnumerable<TSource> System.Linq.Enumerable.Where<TSource(this IEnumerable<TSource>, Func<TSource,bool>)' 的类型参数不能从用法中推断出来.尝试明确指定参数.

这抓住了我措手不及,所以我想这个要检查我的理智,但是这并没有工作之一:

foreach (var settingsin ConfigurationManager.ConnectionStrings)
{
    if (settings.Name.StartsWith("Xyz")) Console.WriteLine("Found one!");
}
Run Code Online (Sandbox Code Playgroud)

它抱怨没有有关foreach声明,但对.Name位,出现错误:

无法解析符号'名称'

据我所知,有可能是一些防止编译器推断var的类型,仔细检查,我想这其中做的工作:

foreach (ConnectionStringSettings settings in ConfigurationManager.ConnectionStrings)
{
    if (connectionString.Name.StartsWith("Xyz")) Console.WriteLine("Found one!");
}
Run Code Online (Sandbox Code Playgroud)

然而,除了解决我的直接问题外,这对我没什么帮助.我想了解这里发生了什么.

我想要做的就是使用一个简单的LINQ Where语句来获取app.config中连接字符串的子集.为什么编译器阻止我这样做?

Jer*_*oen 18

TL; DR版本

你需要做一个.Cast<ConnectionStringSettings>()让这项工作.

细节

好吧,如果你深入挖掘一下,你可以让编译器告诉你更多:

Func<ConnectionStringSettings, bool> StartsWithXyz = c => c.Name.StartsWith("Xyz");
var relevantSettings = ConfigurationManager.ConnectionStrings.Where(StartsWithXyz);
Run Code Online (Sandbox Code Playgroud)

这告诉你:

无法将实例参数类型' System.Configuration.ConnectionStringSettingsCollection' 转换为' System.Collections.Generic.IEnumerable<System.Configuration.ConnectionStringSettings>'

通过驱动ConnectionStringSettings属性的继承树,您最终可以看到罪魁祸首,这很有意义:该属性属于非泛型IEnumerable类型.

这实际上使得这个问题的一个很复杂的过程重复这个问题,作为解决之道在于铸造非通用属性的通用列表,从而使LINQ和编译器可以做他们的魔法.对于这种特殊的情况下,下面做工作:

var relevantSettings = ConfigurationManager.ConnectionStrings
                                           .Cast<ConnectionStringSettings>()
                                           .Where(c => c.Name.StartsWith("Xyz"));
Run Code Online (Sandbox Code Playgroud)

请享用!