private string Serialize(Settings settings, params Expression <Func <ODataQueryProjectorTest.A, object> >[] expressions)
        {
            var oDataExpressions = expressions.Select(exp => exp.Body as MemberExpression ?? ((UnaryExpression)exp.Body).Operand)
                                   .Select(exp => ODataQueryProjectorTest.ToODataExpression((MemberExpression)exp))
                                   .ToArray();

            var enumerable = Enumerable.Range(0, settings.Count ?? 1).Select(_ => new ODataQueryProjectorTest.A())
                             .ToList();

            if (settings.ModifyAction != null)
            {
                enumerable.ForEach(settings.ModifyAction);
            }

            var projectionResult = ODataQueryProjector.Project(enumerable.AsQueryable(), oDataExpressions);

            var serialized = new ODataJsonSerializer().Serialize(projectionResult.Query, projectionResult.Mapping, inlineCount: null);

            return(serialized);
        }
Esempio n. 2
0
        private void TestProjection(params MemberExpression[] selections)
        {
            // convert selections to expressions
            var selectColumns = selections.Select(ToODataExpression).ToArray();

            // get query
            var items = Enumerable.Range(0, 10).Select(_ => new A()).ToArray();

            // project
            var result      = ODataQueryProjector.Project(items.AsQueryable(), selectColumns);
            var resultItems = result.Query.Cast <object>().ToArray();

            // validate
            var lambdas = selections.Select(exp => exp == null
                    ? a => a
                    : Expression.Lambda <Func <A, object> >(
                                                Expression.Convert(exp, typeof(object)),
                                                (ParameterExpression)Traverse.Along(exp, e => e.Expression as MemberExpression).Last().Expression
                                                ).Compile()
                                            )
                          .ToArray();

            for (var i = 0; i < items.Length; ++i)
            {
                for (var j = 0; j < selectColumns.Length; ++j)
                {
                    var expected = lambdas[j](items[i]);
                    var cmp      = expected.NullSafe(o => ODataRoundTripTest.GetComparer(o.GetType()), EqualityComparer <object> .Default);

                    var path   = result.Mapping[selectColumns[j]];
                    var actual = path.Aggregate(seed: resultItems[i], func: (acc, prop) => prop.GetValue(acc));

                    cmp.Equals(actual, expected).ShouldEqual(true, actual + " vs. " + expected);
                }
            }
        }