我对LinQ有些问题。如何在查询或某些LinQ条件下按名称获取id?这是尝试得到:
var section = ConfigurationManager.GetSection("jobSection");
if (section != null)
{
var jobs = (section as JobSection).Jobs;
var item = from JobElement je in jobs where je.Name == "Job Name A" select je.Id;
Console.WriteLine(item.ToString());
}
这是配置。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="jobSection" type="ConsoleApplication2.JobSection, ConsoleApplication2" />
</configSections>
<jobSection>
<jobs>
<job id="1" name="Job Name A" />
<job id="2" name="Job Name B" />
</jobs>
</jobSection>
</configuration>
但这是输出:
System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [ConsoleApplication2.JobElement,System.Int32]
答案 0 :(得分:4)
当然可以 - 您正在打印Enumerable
由于通用接口上没有ToString
的默认实现,它只打印了类型名称 - 这就是为什么你得到奇怪的答案。
foreach
var section = ConfigurationManager.GetSection("jobSection");
if (section != null)
{
var jobs = (section as JobSection).Jobs;
var query =
from JobElement je in jobs
where je.Name == "Job Name A"
select je.Id;
foreach(var item in query)
Console.WriteLine(item.ToString());
}
如果它有助于将query
视为一种懒惰的数组/列表 - 它只是等着你把它拉出来。
顺便说一下 - 也许你期望得到一个结果。在这种情况下,您可以像这样使用.Single
:
var section = ConfigurationManager.GetSection("jobSection");
if (section != null)
{
var jobs = (section as JobSection).Jobs;
var query =
from JobElement je in jobs
where je.Name == "Job Name A"
select je.Id;
var item = query.Single();
Console.WriteLine(item.ToString());
}
如果结果中没有一个元素,则抛出此值。替代方案是:
.First
(会给你第一个元素,如果没有则会抛出).FirstOrDefault
(将为您提供第一个元素或默认值 - 如果没有项目,则最有可能null
)如果您更深入地了解重载,您会发现可以将Where
和First
(等)部分组合在一起:
var section = ConfigurationManager.GetSection("jobSection");
if (section != null)
{
var jobs = (section as JobSection).Jobs;
var item = jobs.Cast<JobElement>()
.First(je => je.Name == "Job Name A");
Console.WriteLine(item.Id);
}
玩得开心