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
你需要做一个.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)
请享用!
| 归档时间: |
|
| 查看次数: |
2055 次 |
| 最近记录: |