示例#1
0
		public void Test12()
		{
			

			Order order1 = new Order { Customer = Hans, ID = 302, Freight = 2001.99m, OrderDate = DateTime.Now.AddMonths(-20) };

			var assemblies = new Assembly[] { typeof(Order).Assembly, typeof(UnitTests).Assembly, typeof(ExpressionType).Assembly, typeof(IQueryable).Assembly };
			var resolver = new ExpressionSerializationTypeResolver(assemblies, new Type[] { typeof(Customer), typeof(Order), typeof(Product), typeof(Supplier), typeof(Shipper) });
			ExpressionSerializer serializer = new ExpressionSerializer(resolver);

			IEnumerable<Customer> customers = GetCustomers().ToArray();
            Expression<Func<int, IEnumerable<Order[]>>> e12 =
             n =>
                 from c in customers//instance == null : IEnumerable.Where/.Select
                 where c.ID < n
                 select c.Orders.ToArray();
			e12 = ( Expression<Func<int, IEnumerable<Order[]>>>)ObjectServices.Evaluator.PartialEval(e12);
			MethodCallExpression m1 = ((MethodCallExpression)e12.Body).Arguments[0] as MethodCallExpression;
			ConstantExpression cx = ((ConstantExpression)m1.Arguments[0]);
			LambdaExpression lambdaarg = ((LambdaExpression)m1.Arguments[1]);
			//Expression arg1 = ((MethodCallExpression)e12.Body).Arguments[1];
			XElement xml12 = serializer.Serialize(e12);
			
            Expression result12 = serializer.Deserialize( xml12);
            Assert.AreEqual( e12.ToString(), result12.ToString());
            Console.WriteLine(((result12 as Expression<Func<int, IEnumerable<Order[]>>>).Compile())(5));
		}
示例#2
0
 public void PrimitiveTypeTest()
 {
     Expression<Func<int>> addExpr = () => 1 + 1;
     var serializer = new ExpressionSerializer();
     XElement addXml = serializer.Serialize(addExpr);
     Expression<Func<int>> addExpResult = serializer.Deserialize<Func<int>>(addXml);
     Func<int> addExpResultFunc = addExpResult.Compile();
     Assert.AreEqual(2, addExpResultFunc());  // evaluates to 2
 }
示例#3
0
 public void ComplexTypeTest()
 {
     Expression<Func<Customer, bool>> addExpr = (customer) => string.IsNullOrEmpty(customer.CustomerID);
     var serializer = new ExpressionSerializer();
     XElement addXml = serializer.Serialize(addExpr);
     var addExpResult = serializer.Deserialize<Func<Customer, bool>>(addXml);
     Func<Customer, bool> addExpResultFunc = addExpResult.Compile();
     Assert.AreEqual(true, addExpResultFunc(new Customer() { CustomerID = "Allen" }));  // evaluates to 2
 }
        public static IQueryable DeserializeQuery(this DataContext dc, XElement rootXml)
        {
			var resolver = new TypeResolver(assemblies: null, knownTypes: GetKnownTypesFromTables(dc) );
            DLinqCustomExpressionXmlConverter customConverter = new DLinqCustomExpressionXmlConverter(dc, resolver);
			ExpressionSerializer serializer = new ExpressionSerializer(resolver, new List<CustomExpressionXmlConverter> { customConverter });
            Expression queryExpr = serializer.Deserialize(rootXml);
            // Query kind is populated by the ResolveXmlFromExpression method
            if (customConverter.QueryKind == null)
                throw new Exception(string.Format("CAnnot deserialize into DLinq query for datacontext {0} - no Table found", dc));
            return customConverter.QueryKind.Provider.CreateQuery(queryExpr);
        }
        //public static IQueryable DeserializeQuery(this DataContext dc, XElement rootXml)
		public static IQueryable DeserializeQuery(this ObjectContext dc, XElement rootXml)
        {
            DLinqSerializationTypeResolver resolver = new DLinqSerializationTypeResolver(dc);
            DLinqCustomExpressionXmlConverter customConverter = new DLinqCustomExpressionXmlConverter(dc, resolver);
            ExpressionSerializer serializer = new ExpressionSerializer(resolver) { Converters = { customConverter } };
            Expression queryExpr = serializer.Deserialize(rootXml);
            // Query kind is populated by the ResolveXmlFromExpression method
            if (customConverter.QueryKind == null)
                throw new Exception(string.Format("CAnnot deserialize into DLinq query for datacontext {0} - no Table found", dc));
            return customConverter.QueryKind.Provider.CreateQuery(queryExpr);
        }
        public List<Character> GetCharacters(XElement query)
        {
            var serializer = new ExpressionSerializer();
              var expression = serializer.Deserialize<Func<Character, bool>>(query);
              if (expression == null)
            return null;

              using (var db = new RevolutionEntities1())
              {
            return db.Characters.Where(expression).ToList();
              }
        }
示例#7
0
        // Very simple serialization example
        public static void BasicExpressionSerialization()
        {
            Console.WriteLine("BASIC SAMPLE - Serialize/Deserialize Simple Expression:");

            Expression<Func<int, int, int>> addExpr = (x, y) => x + y;
            ExpressionSerializer serializer = new ExpressionSerializer();
            XElement addXml = serializer.Serialize(addExpr);
            Expression<Func<int,int,int>> addExpResult = serializer.Deserialize<Func<int,int,int>>(addXml);
            Func<int, int, int> addExpResultFunc = addExpResult.Compile();
            int result = addExpResultFunc(1, 2);  // evaluates to 3

            Console.WriteLine("Deserialized Expression Tree:");
            Console.WriteLine(" " + addExpResult.ToString());
            Console.WriteLine();
        }
示例#8
0
        public static IQueryable DeserializeQuery(this DataContext dc, XElement rootXml)
        {
            var resolver = new TypeResolver(assemblies: null, knownTypes: GetKnownTypesFromTables(dc));
            DLinqCustomExpressionXmlConverter customConverter = new DLinqCustomExpressionXmlConverter(dc, resolver);
            ExpressionSerializer serializer = new ExpressionSerializer(resolver, new List <CustomExpressionXmlConverter> {
                customConverter
            });
            Expression queryExpr = serializer.Deserialize(rootXml);

            // Query kind is populated by the ResolveXmlFromExpression method
            if (customConverter.QueryKind == null)
            {
                throw new Exception(string.Format("CAnnot deserialize into DLinq query for datacontext {0} - no Table found", dc));
            }
            return(customConverter.QueryKind.Provider.CreateQuery(queryExpr));
        }
示例#9
0
        //public static IQueryable DeserializeQuery(this DataContext dc, XElement rootXml)
        public static IQueryable DeserializeQuery(this ObjectContext dc, XElement rootXml)
        {
            DLinqSerializationTypeResolver    resolver        = new DLinqSerializationTypeResolver(dc);
            DLinqCustomExpressionXmlConverter customConverter = new DLinqCustomExpressionXmlConverter(dc, resolver);
            ExpressionSerializer serializer = new ExpressionSerializer(resolver)
            {
                Converters = { customConverter }
            };
            Expression queryExpr = serializer.Deserialize(rootXml);

            // Query kind is populated by the ResolveXmlFromExpression method
            if (customConverter.QueryKind == null)
            {
                throw new Exception(string.Format("CAnnot deserialize into DLinq query for datacontext {0} - no Table found", dc));
            }
            return(customConverter.QueryKind.Provider.CreateQuery(queryExpr));
        }
示例#10
0
        // Serializing an expression tree representing a query expression
        public static void ComplexExpressionSerializationSamples()
        {
            Console.WriteLine("COMPLEX SAMPLE - Serialize/Deserialize In-Memory Query Expression:");

            Expression<Func<IEnumerable<int>>> queryExp = () => from i in Enumerable.Range(1, 10)
                                                                where i % 2 == 0
                                                                select i * i;

            ExpressionSerializer serializer = new ExpressionSerializer();
            XElement queryXml = serializer.Serialize(queryExp);
            Expression<Func<IEnumerable<int>>> queryExpResult = serializer.Deserialize<Func<IEnumerable<int>>>(queryXml);

            // Print out the expression tree: "(x, y) => x + y"
            Console.WriteLine("Deserialized Expression Tree:");
            Console.WriteLine(" " + queryExpResult.ToString());

            // Call it
            Func<IEnumerable<int>> f = queryExpResult.Compile();
            IEnumerable<int> result = f();
            Console.WriteLine("\nResults: ");
            result.ToList().ForEach(n => Console.WriteLine(" " + n));
            Console.WriteLine();
        }
        protected System.Tuple<Expression, Type> DeserializeExpression(XElement rootXml)
        {
            //move to ctor
            BoxSerializationTypeResolver resolver = new BoxSerializationTypeResolver(this);
            BoxCustomExpressionXmlConverter customConverter = new BoxCustomExpressionXmlConverter(resolver, RepoFinder.Mappings);
            ExpressionSerializer serializer = new ExpressionSerializer(resolver) { Converters = { customConverter } };

            return new System.Tuple<Expression, Type>(serializer.Deserialize(rootXml), customConverter.QueryKind.ElementType);
        }
		public void Tests1To11()
		{
			Order order1 = new Order { Customer = Hans, ID = 302, Freight = 2001.99m, OrderDate = DateTime.Now.AddMonths(-20) };

			var assemblies = new Assembly[] { typeof(Order).Assembly, typeof(BaseTests).Assembly, typeof(ExpressionType).Assembly, typeof(IQueryable).Assembly };
			var resolver = new TypeResolver(assemblies, new Type[] { typeof(Customer), typeof(Order), typeof(Product), typeof(Supplier), typeof(Shipper) });
			ExpressionSerializer serializer = new ExpressionSerializer(resolver);

			Console.WriteLine("\nTEST - 2");
			Expression<Func<int>> e2 = () => 1;
			XElement xml2 = serializer.Serialize(e2.Body);
			Expression result2 = serializer.Deserialize(xml2);
			Assert.AreEqual(e2.Body.ToString(), result2.ToString());

			Console.WriteLine("\nTEST - 3");
			Expression<Func<ExpressionType>> e3 = () => ExpressionType.Add;
			XElement xml3 = serializer.Serialize(e3.Body);
			Expression result3 = serializer.Deserialize(xml3);
			Assert.AreEqual(e3.Body.ToString(), result3.ToString());

			Console.WriteLine("\nTEST - 4");
			Expression<Func<bool>> e4 = () => true;
			XElement xml4 = serializer.Serialize(e4.Body);
			Expression result4 = serializer.Deserialize(xml4);
			Assert.AreEqual(e4.Body.ToString(), result4.ToString());

			Console.WriteLine("\nTEST - 5");
			Expression<Func<decimal, decimal>> e5 = d => d + 1m;
			XElement xml5 = serializer.Serialize(e5.Body);
			Expression result5 = serializer.Deserialize(xml5);
			Assert.AreEqual(e5.Body.ToString(), result5.ToString());

			Console.WriteLine("\nTEST - 6");
			Expression<Func<decimal, decimal>> e6 = d => d + 1m;
			XElement xml6 = serializer.Serialize(e6);
			Expression result6 = serializer.Deserialize(xml6);
			Assert.AreEqual(e6.ToString(), result6.ToString());
			Console.WriteLine(((result6 as Expression<Func<decimal, decimal>>).Compile())(3));

			Console.WriteLine("\nTEST - 7");
			Expression<Func<string, int>> e7 = s => int.Parse(s);
			XElement xml7 = serializer.Serialize(e7);
			Expression result7 = serializer.Deserialize(xml7);
			Assert.AreEqual(e7.ToString(), result7.ToString());
			Console.WriteLine(((result7 as Expression<Func<string, int>>).Compile())("1234"));

			Console.WriteLine("\nTEST - 8");
			Expression<Func<string, string>> e8 = s => s.PadLeft(4);
			XElement xml8 = serializer.Serialize(e8);
			Expression result8 = serializer.Deserialize(xml8);
			Assert.AreEqual(e8.ToString(), result8.ToString());
			Console.WriteLine(((result8 as Expression<Func<string, string>>).Compile())("1"));

			Console.WriteLine("\nTEST - 9");
			Expression<Func<string, int>> e9 = s => Foo<string, int>(s, 1);
			XElement xml9 = serializer.Serialize(e9);
			Expression result9 = serializer.Deserialize(xml9);
			Assert.AreEqual(e9.ToString(), result9.ToString());
			Console.WriteLine(((result9 as Expression<Func<string, int>>).Compile())("abcdac"));

			Console.WriteLine("\nTEST - 10");
			Expression<Func<string, char[]>> e10 = s => s.Where(c => c != 'a').ToArray();
			XElement xml10 = serializer.Serialize(e10);
			Expression result10 = serializer.Deserialize(xml10);
			Assert.AreEqual(e10.ToString(), result10.ToString());
			Console.WriteLine(((result10 as Expression<Func<string, char[]>>).Compile())("abcdac"));

			Console.WriteLine("\nTEST - 11");
			Expression<Func<string, char[]>> e11 =
				s =>
					(from c in s
					 where c != 'a'
					 select (char)(c + 1)).ToArray();
			XElement xml11 = serializer.Serialize(e11);
			Expression result11 = serializer.Deserialize(xml11);
			Assert.AreEqual(e11.ToString(), result11.ToString());
			Console.WriteLine(((result11 as Expression<Func<string, char[]>>).Compile())("abcdac"));



			Console.WriteLine("\nTEST - 19");
			Expression<Func<object, string>> e19 = o => o as string;
			XElement xml19 = serializer.Serialize(e19);
			Expression result19 = serializer.Deserialize(xml19);
			Assert.AreEqual(e19.ToString(), result19.ToString());
			Console.WriteLine(((result19 as Expression<Func<object, string>>).Compile())(7));

			Console.WriteLine("\nTEST - 20");
			Expression<Func<object, bool>> e20 = o => o is string;
			XElement xml20 = serializer.Serialize(e20);
			Expression result20 = serializer.Deserialize(xml20);
			Assert.AreEqual(e20.ToString(), result20.ToString());
			Console.WriteLine(((result20 as Expression<Func<object, bool>>).Compile())(7));

			Console.WriteLine("\nTEST - 21");
			Expression<Func<IEnumerable<string>>> e21 = () => from m in typeof(string).GetMethods()
															  where !m.IsStatic
															  group m by m.Name into g
															  select g.Key + g.Count().ToString();

			XElement xml21 = serializer.Serialize(e21);
			Expression result21 = serializer.Deserialize(xml21);
			Assert.AreEqual(e21.ToString(), result21.ToString());
			Console.WriteLine(((result21 as Expression<Func<IEnumerable<string>>>).Compile())());

			Console.WriteLine("\nTEST - 22 (may take a while)");
			Expression<Func<IEnumerable<int>>> e22 = () => from a in Enumerable.Range(1, 13)
														   join b in Enumerable.Range(1, 13) on 4 * a equals b
														   from c in Enumerable.Range(1, 13)
														   join d in Enumerable.Range(1, 13) on 5 * c equals d
														   from e in Enumerable.Range(1, 13)
														   join f in Enumerable.Range(1, 13) on 3 * e equals 2 * f
														   join g in Enumerable.Range(1, 13) on 2 * (c + d) equals 3 * g
														   from h in Enumerable.Range(1, 13)
														   join i in Enumerable.Range(1, 13) on 3 * h - 2 * (e + f) equals 3 * i
														   from j in Enumerable.Range(1, 13)
														   join k in Enumerable.Range(1, 13) on 3 * (a + b) + 2 * j - 2 * (g + c + d) equals k
														   from l in Enumerable.Range(1, 13)
														   join m in Enumerable.Range(1, 13) on (h + i + e + f) - l equals 4 * m
														   where (4 * (l + m + h + i + e + f) == 3 * (j + k + g + a + b + c + d))
														   select a + b + c + d + e + f + g + h + i + j + k + l + m;
			XElement xml22 = serializer.Serialize(e22);
			Expression result22 = serializer.Deserialize(xml22);
			Assert.AreEqual(e22.ToString(), result22.ToString());
			Console.WriteLine(((result22 as Expression<Func<IEnumerable<int>>>).Compile())().FirstOrDefault());

			Console.WriteLine("\nTEST - 23");
			Expression<Func<int, int>> e23 = n => ((Func<int, int>)(x => x + 1))(n);
			XElement xml23 = serializer.Serialize(e23);
			Expression result23 = serializer.Deserialize(xml23);
			Assert.AreEqual(e23.ToString(), result23.ToString());
			Console.WriteLine(((result23 as Expression<Func<int, int>>).Compile())(7));


			Console.WriteLine("\nTEST - 24");
			Expression<Func<IEnumerable<int>>> e24 = () => from x in Enumerable.Range(1, 10)
														   from y in Enumerable.Range(1, 10)
														   where x < y
														   select x * y;
			XElement xml24 = serializer.Serialize(e24);
			Expression result24 = serializer.Deserialize(xml24);
			Assert.AreEqual(e24.ToString(), result24.ToString());
			Console.WriteLine(((result24 as Expression<Func<IEnumerable<int>>>).Compile())());

			Console.WriteLine("\nTEST - 25");
			Expression<Func<DateTime>> e25 = () => new DateTime(10000);
			XElement xml25 = serializer.Serialize(e25);
			Expression result25 = serializer.Deserialize(xml25);
			Assert.AreEqual(e25.ToString(), result25.ToString());
			Console.WriteLine(((result25 as Expression<Func<DateTime>>).Compile())());

		}
示例#13
0
		public void BasicExpressionSerialization()
		{
			Type funcT1T2T3 = typeof(Func<>).Assembly.GetType("System.Func`3");

			Debug.WriteLine("BASIC SAMPLE - Serialize/Deserialize Simple Expression:");
			XElement addXml;
			Expression<Func<int, int, int>> addExpr = (x, y) => x + y;
			ExpressionSerializer serializer = new ExpressionSerializer();
			Expression simplifiedAddExpr = Evaluator.PartialEval(addExpr);
			//addXml = serializer.Serialize(simplifiedAddExpr);	//does not seem necessary
			addXml = serializer.Serialize(addExpr);
			Expression<Func<int, int, int>> addExpResult = serializer.Deserialize<Func<int, int, int>>(addXml);
			Func<int, int, int> addExpResultFunc = addExpResult.Compile();
			int result = addExpResultFunc(1, 2);  // evaluates to 3

			Debug.WriteLine("Deserialized Expression Tree:");
			Debug.WriteLine(" " + addExpResult.ToString());
		}
示例#14
0
        private static object GetMergeFunc(string str, string mapreduce, Type itemType)
        {
            if (str == null) return null;

            object result = null;

            //if (mergeFuncCache.TryGetValue(str, out result)) return result;

            //if (str == DefaultToken)
            //{
            //    Expression<Func<IEnumerable<Datapoint>, double>> merge = x => x.Sum(y => y.Value);
            //    result = merge.Compile();
            //}
            //else if (str == "__average__")
            //{
            //    Expression<Func<IEnumerable<Datapoint>, double>> merge = x => x.Sum(y => y.Value * (double)y.Count) / x.Sum(y => y.Count);
            //    result = merge.Compile();
            //}
            if (str == DefaultToken)
            {
                if (!mapreduce.StartsWith(QlHeader)) throw new Exception("QL based mapreduce expression must be used with __default__ merge specification");
                var expr = EvoQLBuilder.GetMergeExpression(mapreduce.Substring(QlHeader.Length), itemType);
                var type = expr == null ? null : expr.GetType();
                var compileMethod = expr == null ? null : type.GetMethods().FirstOrDefault(x => x.Name == "Compile" && x.GetParameters().Length == 0);
                result = compileMethod.Invoke(expr, new object[0]);
            }
            else
            {
                var serializer = new ExpressionSerializer(new TypeResolver(new Assembly[] { Assembly.GetAssembly(typeof(Entities.Thrift.ThriftMention)) }));
                var expr = serializer.Deserialize<Func<IEnumerable<Datapoint>, double>>(XElement.Parse(str));
                result = expr.Compile();
            }

            mergeFuncCache[str] = result;

            return result;
        }
示例#15
0
        private static object GetMapReduceFunc(string str, Type itemType, out Type resultType)
        {
            if (str == null)
            {
                resultType = null;
                return null;
            }

            object result = null;

            //if (reduceFuncCache.TryGetValue(str, out result)) return result;

            if (str.StartsWith(QlHeader))
            {
                var expr = EvoQLBuilder.GetReduceExpression(str.Substring(QlHeader.Length), itemType);
                var type = expr == null ? null : expr.GetType();
                resultType = expr == null ? itemType : ReduceExpressionGeneration.GetTypeOfEnumerable( type.GetProperty("ReturnType").GetValue(expr, null) as Type );
                var compileMethod = expr == null ? null : type.GetMethods().FirstOrDefault(x => x.Name == "Compile" && x.GetParameters().Length == 0);
                result = compileMethod.Invoke(expr, new object[0]);
            }
            else
            {
                var serializer = new ExpressionSerializer(new TypeResolver(new Assembly[] { Assembly.GetAssembly(typeof(Mention)) }));
                var expr = serializer.Deserialize<Func<IEnumerable<Mention>, IEnumerable<Datapoint>>>(XElement.Parse(str));
                resultType = typeof(Datapoint);
                result = expr.Compile();
            }

            reduceFuncCache[str] = result;

            return result;
        }
示例#16
0
        private static object GetFilterFunc(string str, Type itemType)
        {
            if (str == null) return null;

            object result = null;

            if (filterFuncCache.TryGetValue(str, out result)) return result;

            if (str.StartsWith(QlHeader))
            {
                var expr = EvoQLBuilder.GetWhereExpression(str.Substring(QlHeader.Length), itemType);
                var type = expr == null ? null : expr.GetType();
                var compileMethod = expr == null ? null : type.GetMethods().FirstOrDefault(x => x.Name == "Compile" && x.GetParameters().Length == 0);
                result = compileMethod.Invoke(expr, new object[0]);
            }
            else
            {
                var serializer = new ExpressionSerializer(new TypeResolver(new Assembly[] { Assembly.GetAssembly(typeof(Mention)) }));
                var expr = serializer.Deserialize<Func<Mention, object[], bool>>(XElement.Parse(str));
                result = expr.Compile();
            }

            filterFuncCache[str] = result;

            return result;
        }
示例#17
0
 public void TestExpresstion([FromBody] XElement s)
 {
     //XElement x = JsonConvert.DeserializeObject<XElement>(s);
     var serializer = new ExpressionSerializer();
     var newPredicate = serializer.Deserialize<Func<string, bool>>(s);
 }