Select()方法如何返回匿名类型?

时间:2012-12-06 14:47:32

标签: c# linq nhibernate entity-framework-4 anonymous-types

我知道无法从方法返回匿名类型。我也明白,有办法解决这个问题。我的问题是,Linq提供商使用什么方法?例如,(提示对Linq提供程序的工作方式有点了解),Select()扩展方法应用于IQueryable,其表达式树由Linq提供程序解析,转换为SQL,查询结果解析,加载到一个类型然后....返回。

因此,使用Select()返回该类型的技术是什么?实体框架还是NHibernate?

2 个答案:

答案 0 :(得分:3)

它使用泛型。通过类型推断,编译器知道匿名类型的确切类型 请注意,编译器会自动为匿名类型生成一个类。在那之后,它只是一种类似任何其他类型的类型。

public IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> items,
                                                     Func<TSource, TResult> converter)
{
    foreach(var item in items)
        yield return converter(item);
}

您可以从方法中返回匿名类型。问题是,你不能这样做强类型,因为你不知道匿名类型的类型名称 - 但它是编译器,这就是泛型使用匿名类型的原因。

您正在谈论的解决方法也在使用泛型。

答案 1 :(得分:2)

我相信它使用泛型,所以尽管返回类型似乎是“匿名的”,但由于您正在使用它的数据类型,因此它是已知的。

简单的事实是,程序(一旦编译)根据传入(或操作)的类型知道要返回的确切类型

你可以read some more on generics here,它们在编码时非常有用 - 只要你知道何时适当使用它们