如何在ASP.NET中实现AsQueryable()

时间:2014-01-23 14:08:55

标签: c# .net linq

我看到这个扩展方法是

/// <summary>
/// Converts a generic <see cref="T:System.Collections.Generic.IEnumerable`1"/> to a generic <see cref="T:System.Linq.IQueryable`1"/>.
/// </summary>
/// 
/// <returns>
/// An <see cref="T:System.Linq.IQueryable`1"/> that represents the input sequence.
/// </returns>
/// <param name="source">A sequence to convert.</param><typeparam name="TElement">The type of the elements of <paramref name="source"/>.</typeparam><exception cref="T:System.ArgumentNullException"><paramref name="source"/> is null.</exception>
public static IQueryable<TElement> AsQueryable<TElement>(this IEnumerable<TElement> source)
{
  return (IQueryable<TElement>) null;
}

但是我不明白返回是做什么的,只是返回null不是吗?

2 个答案:

答案 0 :(得分:4)

ReSharper给了我以下内容:

/// <summary>
/// Converts a generic <see cref="T:System.Collections.Generic.IEnumerable`1"/> to a generic <see cref="T:System.Linq.IQueryable`1"/>.
/// </summary>
/// 
/// <returns>
/// An <see cref="T:System.Linq.IQueryable`1"/> that represents the input sequence.
/// </returns>
/// <param name="source">A sequence to convert.</param><typeparam name="TElement">The type of the elements of <paramref name="source"/>.</typeparam><exception cref="T:System.ArgumentNullException"><paramref name="source"/> is null.</exception>
[__DynamicallyInvokable]
public static IQueryable<TElement> AsQueryable<TElement>(this IEnumerable<TElement> source)
{
  if (source == null)
    throw System.Linq.Error.ArgumentNull("source");
  if (source is IQueryable<TElement>)
    return (IQueryable<TElement>) source;
  else
    return (IQueryable<TElement>) new EnumerableQuery<TElement>(source);
}

VS的标准概述算法就是这样。 VS没有给你真正的实现细节。

答案 1 :(得分:1)

我不认为你所看到的是代码的最终版本或完整版本。对于.NET 3.5来说,Reflector给了我这个(几乎与timmkrause的答案相同):

public static IQueryable<TElement> AsQueryable<TElement>(this IEnumerable<TElement> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    if (source is IQueryable<TElement>)
    {
        return (IQueryable<TElement>) source;
    }
    return new EnumerableQuery<TElement>(source);
}

您需要使用反汇编程序从已编译的CLR汇编代码返回到源实现;元数据提供程序(例如Visual Studio 2012中内置的元数据提供程序或类似程序)通常不会为您提供实际的来源。

请注意,Resharper和Reflector提供了不同的样式和命名资格,但每个都显示相同的功能。