예제 #1
0
		public void TestJoin()
		{
			using (var db = CreateSqlServerDB())
			{
				try
				{
					db.SqlMode = SqlModes.Text;
					db.BeginTransaction();

					// Insert a new order
					Order newOrder = new Order();
					newOrder.OrderName = "new order";
					int orderID = Convert.ToInt32(db.Insert<Order>().Entity(newOrder).GetIdentity().Execute());
					Assert.IsTrue(orderID > 0);

					// Update order name to use the generated ID autoincremented value
					newOrder.OrderName = string.Concat(newOrder.OrderName, " ", newOrder.ID);
					db.Update<Order>(newOrder, o => o.ID == newOrder.ID);

					// Add an order item associated to the newly added order
					OrderItem orderItem = new OrderItem { OrderID = newOrder.ID, ItemDescription = "Test item", Price = 5.5m };
					int orderItemID = Convert.ToInt32(db.Insert<OrderItem>().Entity(orderItem).GetIdentity().Execute());
					Assert.IsTrue(orderItemID > 0);

					// Add a receipt associated to the new ordeer / order item
					Receipt receipt = new Receipt { OrderItemID = orderItem.ID, AmountPaid = 5.5m };
					db.Insert<Receipt>(receipt);

					// Query the newly added order with its order item (do not query receipt)
					var orderWithItem = db.Query<Order>()
						.Join<Order, OrderItem>(JoinType.Left, o => o.OrderItems, (o, oi) => o.ID == oi.OrderID)
						.Where(o => o.ID == newOrder.ID)
						.FirstOrDefault();

					// Query the newly added order with associated order item and receipt
					var orderWithItemAndReceipt = db.Query<Order>()
						.Join<Order, OrderItem>(JoinType.Left, o => o.OrderItems, (o, oi) => o.ID == oi.OrderID)
						.Join<OrderItem, Receipt>(JoinType.Left, oi => oi.ItemReceipt, (oi, r) => oi.ID == r.OrderItemID)
						.Where(o => o.ID == newOrder.ID).FirstOrDefault();

					Assert.IsNotNull(orderWithItem);
					Assert.IsTrue(orderWithItem.OrderItems.Count == 1);
					Assert.IsNull(orderWithItem.OrderItems[0].ItemReceipt);

					Assert.IsNotNull(orderWithItemAndReceipt.OrderItems[0].ItemReceipt);

					// Delete all added items
					db.Delete<Order>(o => o.ID == orderID);
					db.Delete<OrderItem>(oi => oi.ID == orderItemID);
					db.Delete<Receipt>(r => r.OrderItemID == orderItemID);

					// Verify items are deleted
					var receipts = db.Query<Receipt>().Where(r => r.OrderItemID == orderItemID).ToList();
					Assert.IsTrue(receipts.Count == 0);

					var orderItems = db.Query<OrderItem>().Where(oi => oi.ID == orderItemID).ToList();
					Assert.IsTrue(orderItems.Count == 0);

					var orders = db.Query<Order>().Where(o => o.ID == orderID).ToList();
					Assert.IsTrue(orders.Count == 0);
				}
				catch
				{
					throw;
				}
				finally
				{
					db.RollBack();
				}
			}
		}
예제 #2
0
		public void Test_Filtering_ChildrenToload_With_Graph()
		{
			using (var db = CreateSqlServerDB())
			{
				try
				{
					db.SqlMode = SqlModes.Text;
					db.BeginTransaction();

					// Insert 10 orders
					for (int i = 1; i < 11; i++)
					{
						Order order = new Order { OrderName = "Order" + (i.ToString().PadLeft(2, '0')) };
						db.Insert<Order>()
							.Entity(order)
							.GetIdentity()
							.Execute();

						OrderItem orderItem1 = new OrderItem { OrderID = order.ID, ItemDescription = "Desc1", Price = 5.5m };
						OrderItem orderItem2 = new OrderItem { OrderID = order.ID, ItemDescription = "Desc2", Price = 6.6m };
						db.Insert<OrderItem>(orderItem1);
						db.Insert<OrderItem>(orderItem2);

						Receipt receipt1 = new Receipt { OrderItemID = orderItem1.ID, AmountPaid = orderItem1.Price };
						Receipt receipt2 = new Receipt { OrderItemID = orderItem2.ID, AmountPaid = orderItem2.Price };
						db.Insert<Receipt>(receipt1);
						db.Insert<Receipt>(receipt2);
					}
					
					// Try to get entire graph, including orderitems and receipts
					var orders = db.Query<Order>().FromView("V_OrdersReceipts").Graph(o => o.OrderItems, o => o.OrderItems.First().ItemReceipt).ToList();
					Assert.IsTrue(orders.Count > 0);
					Assert.IsNotNull(orders[0].OrderItems);
					Assert.IsNotNull(orders[0].OrderItems[0].ItemReceipt);

					// Try to get filtered graph without receipt
					var orders2 = db.Query<Order>().FromView("V_OrdersReceipts").Graph(o => o.OrderItems).ToList();
					Assert.IsTrue(orders2.Count > 0);
					Assert.IsNotNull(orders2[0].OrderItems);
					Assert.IsNull(orders2[0].OrderItems[0].ItemReceipt);
				}
				catch
				{
					throw;
				}
				finally
				{
					db.RollBack();
				}
			}
		}