我正在攻读MS考试70-483(C#),这个想法发生在我身上。
是否可以做这样的事情:
class Person
{
public string Name { get; set; }
public int CityId { get; set; }
}
class City
{
public string Name { get; set; }
public int Id { get; set; }
}
/ *假设代码填充列表人员和列表城市* /
var personsByCity = from p in people join c in cities
on p.CityId equals c.Id
select new { PersonName = p.Name, CityName = c.Name,
ToString = Func<string>( () => { return PersonName + "/" +
CityName; })};
发生的编译器错误是“[CS0119]表达式表示type' where a
变量'或”方法组“。
Resharper更清楚一点:委托名称此时无效(即Func出现的地方)。
那么,有没有办法在LINQ查询中向匿名类型添加函数?
答案 0 :(得分:2)
是的,你可以声明一个函数,但你不能定义它来返回当前正在声明的匿名类型的属性 - 如果你要使用this
,例如,lambda会捕获声明上下文中的this
的值(包含执行LINQ的代码的类)。但是,您可以捕获用于初始化匿名类的值(正如我在下面的示例中所做的那样)。
请注意, 不 与为匿名类提供方法相同。匿名类只能具有只读的不可变属性。在这种情况下,您的匿名类仍将保留从ToString()
继承的原始object
方法。这可能会tricky to distinguish the function held in the ToString
property from the ToString()
method,所以也许你应该使用不同的名字。
另外,您在new
之前忘记了Func
关键字。
var personsByCity = from p in people join c in cities on p.CityId equals c.Id
select new
{
PersonName = p.Name,
CityName = c.Name,
ToString = new Func<string>( () => {
return c.Name + "/" + p.Name;
})
};