Exemple #1
0
    public static void AddOrAttachLink(this DataServiceContext context, object source, string propertyName, object target)
    {
        var descriptor = context.GetLinkDescriptor(source, propertyName, target);

        if (descriptor == null)
        {
            context.AddLink(source, propertyName, target);
        }
        else if (descriptor.State == EntityStates.Deleted)
        {
            context.DetachLink(source, propertyName, target);
            context.AttachLink(source, propertyName, target);
        }
    }
Exemple #2
0
            public void SDPC_QORFullLoad()
            {
                using (Utils.ConfigurationCacheCleaner())
                    using (Utils.RestoreStaticValueOnDispose(typeof(SimpleDataServiceHelper), "PageSizeCustomizer"))
                    {
                        SimpleDataServiceHelper.PageSizeCustomizer = PageSizeCustomizerFast;
                        SimpleWorkspace workspace = this.NorthwindWorkspacePaged;
                        Uri             baseUri   = new Uri(workspace.ServiceEndPoint + workspace.ServiceContainer.Name + ".svc", UriKind.Absolute);

                        DataServiceContext ctx = new DataServiceContext(baseUri);
                        ctx.EnableAtom = true;
                        ctx.Format.UseAtom();
                        var q = ctx.CreateQuery <northwindBinding.Customers>("Customers").Expand("Orders");

                        int totalCustomerCount = q.Count();
                        int totalOrdersCount   = ctx.CreateQuery <northwindBinding.Orders>("Orders").Count();

                        var qor = q.Execute() as QueryOperationResponse <northwindBinding.Customers>;

                        DataServiceQueryContinuation <northwindBinding.Customers> nextCustLink = null;
                        int custCount  = 0;
                        int orderCount = 0;
                        do
                        {
                            ICollection previousOrderCollection = null;

                            foreach (var c in qor)
                            {
                                try
                                {
                                    if (previousOrderCollection != null)
                                    {
                                        qor.GetContinuation(previousOrderCollection);
                                        Assert.Fail("Out of scope collection did not throw");
                                    }
                                }
                                catch (ArgumentException)
                                {
                                }

                                var nextOrderLink = qor.GetContinuation(c.Orders);
                                while (nextOrderLink != null)
                                {
                                    if (custCount % 2 == 0)
                                    {
                                        var innerQOR = ctx.Execute <northwindBinding.Orders>(nextOrderLink) as QueryOperationResponse <northwindBinding.Orders>;
                                        foreach (var innerOrder in innerQOR)
                                        {
                                            ctx.AttachLink(c, "Orders", innerOrder);
                                            c.Orders.Add(innerOrder);
                                        }
                                        nextOrderLink = innerQOR.GetContinuation();
                                    }
                                    else
                                    {
                                        nextOrderLink = ctx.LoadProperty(c, "Orders", nextOrderLink).GetContinuation();
                                    }
                                }

                                previousOrderCollection = c.Orders;

                                orderCount += c.Orders.Count;
                                custCount++;
                            }

                            nextCustLink = qor.GetContinuation();
                            if (nextCustLink != null)
                            {
                                qor = ctx.Execute <northwindBinding.Customers>(nextCustLink) as QueryOperationResponse <northwindBinding.Customers>;
                            }
                        } while (nextCustLink != null);

                        Assert.AreEqual(totalCustomerCount, custCount);
                        Assert.AreEqual(totalOrdersCount, orderCount);
                        Assert.AreEqual(totalOrdersCount, ctx.Links.Count);
                        Assert.AreEqual(totalCustomerCount + totalOrdersCount, ctx.Entities.Count);
                    }
            }
            public void SDPC_QORFullLoad()
            {
                using (Utils.ConfigurationCacheCleaner())
                using (Utils.RestoreStaticValueOnDispose(typeof(SimpleDataServiceHelper), "PageSizeCustomizer"))
                {
                    SimpleDataServiceHelper.PageSizeCustomizer = PageSizeCustomizerFast;
                    SimpleWorkspace workspace = this.NorthwindWorkspacePaged;
                    Uri baseUri = new Uri(workspace.ServiceEndPoint + workspace.ServiceContainer.Name + ".svc", UriKind.Absolute);

                    DataServiceContext ctx = new DataServiceContext(baseUri);
                    ctx.EnableAtom = true;
                    ctx.Format.UseAtom();
                    var q = ctx.CreateQuery<northwindBinding.Customers>("Customers").Expand("Orders");

                    int totalCustomerCount = q.Count();
                    int totalOrdersCount = ctx.CreateQuery<northwindBinding.Orders>("Orders").Count();

                    var qor = q.Execute() as QueryOperationResponse<northwindBinding.Customers>;

                    DataServiceQueryContinuation<northwindBinding.Customers> nextCustLink = null;
                    int custCount = 0;
                    int orderCount = 0;
                    do
                    {
                        ICollection previousOrderCollection = null;

                        foreach (var c in qor)
                        {
                            try
                            {
                                if (previousOrderCollection != null)
                                {
                                    qor.GetContinuation(previousOrderCollection);
                                    Assert.Fail("Out of scope collection did not throw");
                                }
                            }
                            catch (ArgumentException)
                            {
                            }

                            var nextOrderLink = qor.GetContinuation(c.Orders);
                            while (nextOrderLink != null)
                            {
                                if (custCount % 2 == 0)
                                {
                                    var innerQOR = ctx.Execute<northwindBinding.Orders>(nextOrderLink) as QueryOperationResponse<northwindBinding.Orders>;
                                    foreach (var innerOrder in innerQOR)
                                    {
                                        ctx.AttachLink(c, "Orders", innerOrder);
                                        c.Orders.Add(innerOrder);
                                    }
                                    nextOrderLink = innerQOR.GetContinuation();
                                }
                                else
                                {
                                    nextOrderLink = ctx.LoadProperty(c, "Orders", nextOrderLink).GetContinuation();
                                }
                            }

                            previousOrderCollection = c.Orders;

                            orderCount += c.Orders.Count;
                            custCount++;
                        }

                        nextCustLink = qor.GetContinuation();
                        if (nextCustLink != null)
                        {
                            qor = ctx.Execute<northwindBinding.Customers>(nextCustLink) as QueryOperationResponse<northwindBinding.Customers>;
                        }

                    } while (nextCustLink != null);

                    Assert.AreEqual(totalCustomerCount, custCount);
                    Assert.AreEqual(totalOrdersCount, orderCount);
                    Assert.AreEqual(totalOrdersCount, ctx.Links.Count);
                    Assert.AreEqual(totalCustomerCount + totalOrdersCount, ctx.Entities.Count);
                }
            }