Cra*_*ntz 5 linq expression-trees oftype
重要问题不是"Queryable.OfType 做什么,它是什么"我看到的代码如何实现呢?"
反思Queryable.OfType,我看到(经过一些清理):
public static IQueryable<TResult> OfType<TResult>(this IQueryable source)
{
return (IQueryable<TResult>)source.Provider.CreateQuery(
Expression.Call(
null,
((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(
new Type[] { typeof(TResult) }) ,
new Expression[] { source.Expression }));
}
Run Code Online (Sandbox Code Playgroud)
那么让我看看我是否已经这样做了:
null的现在,此方法的效果是返回一个表达式,该表达式告诉提供程序省略返回类型不等于TResult或其子类型之一的任何值.但我看不出上面的步骤是如何实现这一目标的.它似乎创建了一个表达式,该表达式表示返回IQueryable <TResult>的方法,并使该方法的主体只是整个源表达式,而不需要查看类型.是否只是希望IQueryable提供者只是默默地不返回任何不属于所选类型的记录?
所以上面的步骤在某种程度上是不正确的,或者我只是没有看到它们如何导致在运行时观察到的行为?
它不是null作为方法传入的 - 它将它作为"目标表达式"传递,即它正在调用方法.这是null,因为它OfType是一个静态方法,因此它不需要目标.
调用的重点MakeGenericMethod是GetCurrentMethod()返回开放版本,即OfType<>代替OfType<YourType>.
Queryable.OfType本身并不意味着包含任何省略返回任何值的逻辑.这取决于LINQ提供商.重点Queryable.OfType是构建表达式树以包含对其的调用OfType,以便当LINQ提供程序最终必须将其转换为其本机格式(例如SQL)时,它知道OfType被调用.
这是Queryable一般的工作方式 - 基本上它让提供者将整个查询表达式看作表达式树.这就是它的意思 - 当要求提供商将其转换为真实代码时,这就是魔术发生的地方.
Queryable不可能自己完成工作 - 它不知道提供商代表什么样的数据存储.如何在OfType不知道数据存储是SQL,LDAP还是其他东西的情况下提出语义呢?我同意需要一段时间才能让你的头脑尽头:)
| 归档时间: |
|
| 查看次数: |
910 次 |
| 最近记录: |