我可以在LINQ select子句中声明一个函数吗?

时间:2018-04-18 02:13:33

标签: linq select func

我正在攻读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查询中向匿名类型添加函数?

1 个答案:

答案 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; 
        })
    };