private void RunFilterTestAndVerify(IEnumerable <Product> products, string filter, int[] expectedIds, string expectedExpr, ODataQuerySettings querySettings = null, IAssemblyResolver assembliesResolver = null) { // Act - Bind string to Linq.Expression Expression filterExpr = BindFilter <Product>(filter, _model, querySettings, assembliesResolver); // Assert string acutalExpr = ExpressionStringBuilder.ToString(filterExpr); Assert.Equal(expectedExpr, acutalExpr); // Act IEnumerable <Product> results = InvokeFilter(products, filterExpr); // Assert Assert.True(expectedIds.SequenceEqual(results.Select(a => a.ProductID))); // ordered id }
public void OrderByBinder_BindsComputedPropertyInDollarOrderBy_FromDollarCompute() { // Arrange QueryClause clause = CreateQueryClause("$orderby=Total&$compute=Price mul Qty as Total", _model, typeof(ComputeCustomer)); ODataQuerySettings querySettings = new ODataQuerySettings(); IOrderByBinder binder = new OrderByBinder(); QueryBinderContext context = new QueryBinderContext(_model, querySettings, typeof(ComputeCustomer)); if (clause.Compute != null) { context.AddComputedProperties(clause.Compute.ComputedItems); } // Act OrderByBinderResult orderByResult = binder.BindOrderBy(clause.OrderBy, context); // Assert Assert.Null(orderByResult.ThenBy); Assert.Equal(OrderByDirection.Ascending, orderByResult.Direction); string resultExpression = ExpressionStringBuilder.ToString(orderByResult.OrderByExpression); Assert.Equal("$it => ($it.Price * Convert($it.Qty))", resultExpression); IEnumerable <ComputeCustomer> customers = new[] { new ComputeCustomer { Id = 1, Qty = 3, Price = 5.99 }, new ComputeCustomer { Id = 2, Qty = 5, Price = 2.99 }, new ComputeCustomer { Id = 3, Qty = 2, Price = 18.01 }, new ComputeCustomer { Id = 4, Qty = 4, Price = 9.99 }, }; var orderedResult = OrderByBinderTests.InvokeOrderBy(customers, orderByResult.OrderByExpression, orderByResult.Direction, false); Assert.True(new [] { 2, 1, 3, 4 }.SequenceEqual(orderedResult.Select(a => a.Id))); // ordered id }
public void SelectExpandBinder_BindsComputedPropertyInExpand_FromDollarCompute() { // Arrange QueryClause clause = CreateQueryClause("$expand=Orders($select=Title,Tax;$compute=Amount mul TaxRate as Tax)", _model, typeof(ComputeCustomer)); ODataQuerySettings querySettings = new ODataQuerySettings(); SelectExpandBinder binder = new SelectExpandBinder(); QueryBinderContext context = new QueryBinderContext(_model, querySettings, typeof(ComputeCustomer)); if (clause.Compute != null) { context.AddComputedProperties(clause.Compute.ComputedItems); } // Act Expression selectExp = binder.BindSelectExpand(clause.SelectExpand, context); // Assert Assert.NotNull(selectExp); string resultExpression = ExpressionStringBuilder.ToString(selectExp); Assert.Equal("$it => new SelectAllAndExpand`1() {Model = Microsoft.OData.Edm.EdmModel, " + "Instance = $it, UseInstanceForProperties = True, " + "Container = new NamedPropertyWithNext0`1() " + "{" + "Name = Orders, " + "Value = $it.Orders.Select($it => new SelectSome`1() " + "{" + "Model = Microsoft.OData.Edm.EdmModel, " + "Container = new NamedPropertyWithNext1`1() " + "{" + "Name = Title, " + "Value = $it.Title, " + "Next0 = new NamedProperty`1() {Name = Tax, Value = (Convert($it.Amount) * $it.TaxRate), }, " + "Next1 = new AutoSelectedNamedProperty`1() " + "{" + "Name = Id, Value = Convert($it.Id), " + "}, " + "}, " + "}), " + "Next0 = new NamedProperty`1() {Name = Dynamics, Value = $it.Dynamics, }, }, }", resultExpression); ComputeCustomer customer = new ComputeCustomer { Orders = new List <ComputeOrder> { new ComputeOrder { Title = "Kerry", Amount = 4, TaxRate = 0.35 }, new ComputeOrder { Title = "WU", Amount = 6, TaxRate = 0.5 }, new ComputeOrder { Title = "XU", Amount = 5, TaxRate = 0.12 }, } }; IDictionary <string, object> result = SelectExpandBinderTest.InvokeSelectExpand(customer, selectExp); Assert.Equal(8, result.Count); // Because it's select-all int idx = 0; var ordersValue = result["Orders"] as IEnumerable; foreach (var order in ordersValue) { SelectExpandWrapper itemWrapper = order as SelectExpandWrapper; var orderDic = itemWrapper.ToDictionary(); Assert.Equal(customer.Orders[idx].Title, orderDic["Title"]); Assert.Equal(customer.Orders[idx].Amount * customer.Orders[idx].TaxRate, orderDic["Tax"]); idx++; } }