2

我正在学习 LINQ 并且正在尝试这个与select子句相关的示例。

var q = from c in xmlDoc.Descendants("site").Where(tech => tech.Attribute("technical").Value == "true")
                   .Select(n => new { SiteName = n.Element("name").Value});

上面的查询给了我一个错误:
The type of the expression in the select clause is incorrect. Type inference failed in the call to 'Select'.

上面的语法有什么问题?

除了上述之外,我还必须转换selectedoptions ToDictionary。如何通过 LINQ 在同一个查询中完成?

我想到的第三个问题是关于编写相同查询的不同语法(例如:下面的第二种方法编写示例)。首选什么语法,为什么?

from c in xmlDoc.Descendants
where c.Attriubute("technical").Value == "true"
select c.Element("site").Value;
4

1 回答 1

3

1. 你有混合 lambda 表达式和 linq 语法。以 linq 开始,以 lambda 表达式结束。试试这个

 var q = xmlDoc.Descendants("site").Where(tech => tech.Attribute("technical").Value == "true")
                   .Select(n => new { SiteName = n.Element("name").Value});

或者您应该在 linq 中使用整个查询

var q = from c in xmlDoc.Descendants("site") where c.Attribute("technical").Value == "true"
                   select new { SiteName = c.Element("name").Value};

2. 只在查询结束时使用 ToDictionary

var q = xmlDoc.Descendants("site").Where(tech => tech.Attribute("technical").Value == "true")
                   .Select(n => new { SiteName = n.Element("name").Value,Key= n.Element("id").Value }).ToDictionary(n=>n.Key,l=>l.SiteName);

n=>n.Key 将是字典的键,而 l=>l.siteName 将是值。

3. 创建此类查询有两种方法,一种是使用 linq,另一种是使用使用 lambda 表达式作为参数的方法。两者都很简单,linq 有点像 SQL 查询,而使用 lambda 的方法更像是通过描述方法操作数据的简写。我个人喜欢 lambda 的面向方法的方式,因为它更具顺序可读性。

于 2012-06-20T05:24:38.997 回答