如何创建一个动态LINQ连接扩展方法

前端之家收集整理的这篇文章主要介绍了如何创建一个动态LINQ连接扩展方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有一个动态 LINQ扩展方法的库作为样例与 VisualStudio2008发布.我想用一个连接方法来扩展它.以下代码在运行时失败,参数缺失匹配异常.哪里有问题?
  1. public static IQueryable Join(this IQueryable outer,IEnumerable inner,string outerSelector,string innerSelector,string resultsSelector,params object[] values)
  2. {
  3. if (inner == null)
  4. throw new ArgumentNullException("inner");
  5. if (outerSelector == null)
  6. throw new ArgumentNullException("outerSelector");
  7. if (innerSelector == null)
  8. throw new ArgumentNullException("innerSelector");
  9. if (resultsSelector == null)
  10. throw new ArgumentNullException("resultsSelctor");
  11.  
  12. LambdaExpression outerSelectorLambda =
  13. DynamicExpression.ParseLambda(outer.ElementType,null,outerSelector,values);
  14. LambdaExpression innerSelectorLambda =
  15. DynamicExpression.ParseLambda(inner.AsQueryable().ElementType,innerSelector,values);
  16.  
  17. ParameterExpression[] parameters = new ParameterExpression[] {
  18. Expression.Parameter(outer.ElementType,"outer"),Expression.Parameter(inner.AsQueryable().ElementType,"inner")
  19. };
  20. LambdaExpression resultsSelectorLambda =
  21. DynamicExpression.ParseLambda(parameters,resultsSelector,values);
  22.  
  23. return outer.Provider.CreateQuery(
  24. Expression.Call(
  25. typeof(Queryable),"Join",new Type[] {
  26. outer.ElementType,inner.AsQueryable().ElementType,outerSelectorLambda.Body.Type,innerSelectorLambda.Body.Type,resultsSelectorLambda.Body.Type
  27. },outer.Expression,inner.AsQueryable().Expression,Expression.Quote(outerSelectorLambda),Expression.Quote(innerSelectorLambda),Expression.Quote(resultsSelectorLambda))
  28. );
  29. }

解决方法

我现在已经修好了将CreateQuery(…)调用的参数传给过多的一个小学生错误.将以下代码粘贴到DynamicQueryable类中的Dynamic.cs文件中,以进行动态连接扩展方法.您可以在 http://code.msdn.microsoft.com/csharpsamples找到DynamicQuery示例项目的源代码.
请享用.
  1. public static IQueryable Join(this IQueryable outer,params object[] values)
  2. {
  3. if (inner == null) throw new ArgumentNullException("inner");
  4. if (outerSelector == null) throw new ArgumentNullException("outerSelector");
  5. if (innerSelector == null) throw new ArgumentNullException("innerSelector");
  6. if (resultsSelector == null) throw new ArgumentNullException("resultsSelctor");
  7.  
  8. LambdaExpression outerSelectorLambda = DynamicExpression.ParseLambda(outer.ElementType,values);
  9. LambdaExpression innerSelectorLambda = DynamicExpression.ParseLambda(inner.AsQueryable().ElementType,values);
  10.  
  11. ParameterExpression[] parameters = new ParameterExpression[] {
  12. Expression.Parameter(outer.ElementType,"inner") };
  13. LambdaExpression resultsSelectorLambda = DynamicExpression.ParseLambda(parameters,values);
  14.  
  15. return outer.Provider.CreateQuery(
  16. Expression.Call(
  17. typeof(Queryable),new Type[] {outer.ElementType,resultsSelectorLambda.Body.Type },Expression.Quote(resultsSelectorLambda)));
  18. }
  19.  
  20.  
  21. //The generic overload.
  22. public static IQueryable<T> Join<T>(this IQueryable<T> outer,IEnumerable<T> inner,params object[] values)
  23. {
  24. return (IQueryable<T>)Join((IQueryable)outer,(IEnumerable)inner,values);
  25. }

猜你在找的C#相关文章