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); }
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); } } }