使用 LINQWhere 查询仅获取部分 ConfigurationManager.ConnectionStrings

2024-03-30

我的目标是使用 LINQWhere查询于ConfigurationManager.ConnectionStrings控制台应用程序中的集合(假设一个新的 .NET 4.5 控制台应用程序添加了 System.Configuration 引用,并添加了相应的using陈述)。

我从这个开始,这确实not work:

var relevantSettings =
        ConfigurationManager.ConnectionStrings.Where(s => s.Name.StartsWith("Xyz"));

它告诉我:

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

这让我措手不及,所以我尝试用这个来检查我的理智,但是这确实not work either:

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

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

无法解析符号“名称”

我知道可能有一些东西阻止编译器推断var的类型,为了仔细检查我尝试了这个which does work:

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

然而,除了解决我眼前的问题之外,这对我没有多大帮助。我想要理解这里发生了什么。

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


TL;DR 版本

你需要做一个.Cast<ConnectionStringSettings>()使这项工作成功。

Details

好吧,如果你再深入一点,你可以让编译器告诉你更多信息:

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

这是告诉你:

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

驱动继承树ConnectionStringSettings属性你终于可以看到罪魁祸首了,这很有意义:该财产属于non通用的IEnumerable type.

这实际上使这个问题成为一个相当复杂的重复这个问题 https://stackoverflow.com/q/776397/419956,因为解决方案在于将非泛型属性转换为泛型列表,以便 LINQ 和编译器可以发挥其魔力。对于这个特殊场景,下列does work:

var relevantSettings = ConfigurationManager.ConnectionStrings
                                           .Cast<ConnectionStringSettings>()
                                           .Where(c => c.Name.StartsWith("Xyz"));

Enjoy!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 LINQWhere 查询仅获取部分 ConfigurationManager.ConnectionStrings 的相关文章

随机推荐