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