我正在一个使用Oracle和DynamicLinq的项目中,结果发现DynamicLinq正在构建非常慢的查询:
SELECT /*FIELDS*/ FROM MYTABLE WHERE (("STRT_DT" >= TO_TIMESTAMP('2015-07-09
00:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF')) AND
("STRT_DT" <= TO_TIMESTAMP('2018-07-04 00:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF')))
问题是使用TO_TIMESTAMP('2018-07-04 00:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF')
而不是TO_DATE
生成查询:
STRT_DT >= TO_DATE('09-JUL-14','DD-MON-YY') and
STRT_DT <= TO_DATE('04-JUL-18','DD-MON-YY')
使用TO_DATE
代替TO_TIMESPAN
时速度更快。
我一直在调试代码,并发现DynamicLinq.cs
类在哪里构建查询:
public static IQueryable Where(this IQueryable source, string predicate, params object[] values)
{
LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType,
typeof(bool), predicate, values);
var test = source.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Where",
new Type[] { source.ElementType },
source.Expression, Expression.Quote(lambda)));
return test;
}
lambda变量的值为{Param_0 => (((STRT_DT >= Convert(7/14/2014 12:00:00 AM))) AndAlso
(Param_0.STRT_DT <= Convert(7/18/2014 12:00:00 AM)))}
谓词参数值为:"(VOYAGE_STRT_DT >= @3 and VOYAGE_STRT_DT <= @4)"
and values是一个具有DateTime
值的数组:{7/14/2014 12:00:00 AM}
和{7/18/2014 12:00:00 AM}
如何修改该查询?有任何想法吗?最后生成的查询的类型为IQueryable
,是否可以修改生成的IQueryable
查询?