动态修改Linq生成的查询

时间:2018-07-09 12:55:56

标签: c# oracle linq iqueryable dynamic-linq

我正在一个使用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查询?

0 个答案:

没有答案