Exemplo n.º 1
0
            //TODO: compile LINQ expression?
            internal IQueryable Where(IQueryable source, IEnumerable <Uri> ids, XmlNamespaceManager namespaceManager = null, IOperatorImplementationProvider operatorImplementationProvider = null)
            {
                var parameters = new ParameterExpression[] {
                    Expression.Parameter(source.ElementType)
                };

                var xpqn = new XPathQueryableNavigator(source.ElementType, namespaceManager);
                XPathNodeIterator xpni = xpqn.Select(CoreQueryable.Identifier.Name, namespaceManager);

                if (xpni.MoveNext())
                {
                    var           idn       = (XPathQueryableNavigator)xpni.Current;
                    Type          idType    = idn.Type;
                    TypeConverter converter = GetIdentifierUriConverter(idType);

                    // Convert ids from Uris to identifier type
                    // urip => (idType)converter.ConvertTo(urip, idType)
                    var urip  = Expression.Parameter(typeof(Uri));
                    var conex = Expression.Lambda(
                        typeof(Func <,>).MakeGenericType(typeof(Uri), idType),
                        Expression.Convert(
                            Expression.Call(
                                Expression.Constant(converter),
                                "ConvertTo",
                                null,
                                urip,
                                Expression.Constant(idType)
                                ),
                            idType
                            ),
                        urip
                        );
                    // var convertedIds=ids.Select<Uri, idType>(uri => (idType)converter.ConvertTo(uri, idType))
                    var urilistp   = Expression.Parameter(typeof(IEnumerable <Uri>));
                    var convertids = Expression.Lambda(
                        Expression.Call(
                            typeof(Enumerable),
                            "Select",
                            new Type[] { typeof(Uri), idType },
                            Expression.Constant(ids),
                            conex
                            ),
                        urilistp
                        ).Compile();
                    var convertedIds = convertids.DynamicInvoke(ids);

                    // Creates the Where clause
                    LambdaExpression lambda = Expression.Lambda(
                        Expression.Call(
                            typeof(Enumerable),
                            "Contains",
                            new Type[] { idType },
                            Expression.Constant(convertedIds),
                            idn.CreateExpression(parameters[0])
                            ),
                        parameters
                        );
                    return(source.Provider.CreateQuery(
                               Expression.Call(
                                   typeof(Queryable),
                                   "Where",
                                   new Type[] { source.ElementType },
                                   source.Expression,
                                   Expression.Quote(lambda)
                                   )
                               ));
                }

                throw new InvalidOperationException();
            }