Skip to content

GT185076/SqlDecorator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

97 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sql Decorator


By Gadi Toledano, 2024 , all rights reserved (c)

Sql Decorator is a simple project aimed to practice some of the common design patterns. Sql decorator is also a simple Object Relationship Management mapper to SQL tables.

Example 1: Here an example how SQL Mapping can be easy :

    using SQLDecorator;

    namespace DBTables
    { 
        public class Orders : DBTable
        {
            [ColumnName("OrderID")]
            public IntegerColumn OrderID;
    
            [ColumnName("CustomerID")]
            public IntegerColumn CustomerID;
    
            [ColumnName("OrderDate")]
            public DateTimeColumn OrderDate;

            [ColumnName("ShipName")]
            public StringColumn ShipName;

            public Orders() : base("Orders",  "dbo")
            {}                       
               
            public override TableColumn[] GetPrimaryKey()
              {
                return  new TableColumn[] { OrderID };
              }
        }
    }

Writing a SQL tables query (Select) can be a simple a this :

            var northWind   = new NorthWind(builder.ConnectionString);   
            var product     = new Product();
            var order       = new Orders();
            var orderDetail = new OrderDetails();
            var totalAmount = new IntegerColumn("Total Amount", "Products.UnitPrice * OrderLines.Quantity");

            var select = new Select(northWind)
                 .Top(10)
                 .TableAdd(orderDetail, "OrderLines")
                 .ColumnAdd(orderDetail.ProductId)
                 .ColumnAdd(product.ProductName)
                 .ColumnAdd(totalAmount.Sum())
                 .TableJoin(order, "Orders", order.OrderID.Equal(orderDetail.OrderID))
                 .TableLeftJoin(product, "Products", product.ProductId.Equal(orderDetail.ProductId))
                 .Where(order.OrderDate.GreaterThan(DateTime.Now - new TimeSpan(365 * 32, 0, 0, 0)))
                 .WhereAnd(orderDetail.ProductId.In("12,13,14"))
                 .GroupByAdd(orderDetail.ProductId, product.ProductName)
                 .OrderByAdd(totalAmount.Sum(), OrderBy.Desc)
                 .Having(product.ProductId.Count().GreaterThan(10));

And reading the answer :

    foreach (var record in select.Run())
                {
                    foreach (var f in record.Columns) Console.Write($"{f}\t\t");
                    Console.WriteLine();
                }

The FInal result will be :

    SELECT    TOP(10) 
              "OrderLines"."ProductID" "ProductID" ,
              "Products"."ProductName" "ProductName" ,
              Sum(Products.UnitPrice * OrderLines.Quantity) "Total Amount" 
    FROM      "dbo"."Order Details" "OrderLines"  
    JOIN      "dbo"."Orders" "Orders"  ON ("Orders"."OrderID"="OrderLines"."OrderID") 
    LEFT JOIN "dbo"."Products" "Products"  ON ("Products"."ProductID"="OrderLines"."ProductID")
    WHERE     ("Orders"."OrderDate">'1992-08-05T19:19:37') 
    GROUP BY  "OrderLines"."ProductID","Products"."ProductName" 
    ORDER BY  Sum(Products.UnitPrice * OrderLines.Quantity) Desc

    ProductID       ProductName                     Total Amount
    ---------       -----------                     ------------
    38              'Côte de Blaye'                 164160.5000
    29              'Thüringer Rostbratwurst'       92347.3400
    59              'Raclette Courdavault'          82280.0000
    60              'Camembert Pierrot'             53618.0000
    62              'Tarte au sucre'                53391.9000
    56              'Gnocchi di nonna Alice'        47994.0000
    51              'Manjimup Dried Apples'         46958.0000
    17              'Alice Mutton'                  38142.0000
    18              'Carnarvon Tigers'              33687.5000
    28              'Rössle Sauerkraut'             29184.0000

    10 Rows Selected.

Example 2: All Columns selection and Auto columns mapping back:

           var selectAll = new Select(connection)
                     .TableAdd(orderDetail, "OrderLines", ColumnsSelection.All)
                     .TableJoin(order, "Orders", order.OrderID.Equal(orderDetail.OrderID))
                     .Where(order.OrderDate.GreaterThan(DateTime.Now - new TimeSpan(365 * 32, 0, 0, 0)));

            foreach (var orderDetails in selectAll.Run().Export<OrderDetails>())
            {
                Console.Write($"{orderDetails.OrderID}\t
                                {orderDetails.ProductId}\t
                                {orderDetails.Quantity}\t
                                {orderDetails.UnitPrice}\t
                                {orderDetails.Discount}");
                Console.WriteLine();
            }

Remark :Based On NorthWind Sample data base from : https://github.com/microsoft/sql-server-samples/blob/master/samples/databases/northwind-pubs/instnwnd.sql)

Releases

No releases published

Packages

No packages published