Skip to content

hexarc-software/RawQuery

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RawQuery

Version License

A simple raw sql constructor.

Sometimes there's a need to build complex dynamic sql queries and this is quite hard to do via ORM like EntityFramework or so on. This library just provides an ability to do such things with less pain.

Here's an example how to write a simple pivot query:

///Just some input data. Can be replaced with a real table select.
var income =
    Union.All(
        Clause.Select(
            Format.List(
                Clause.As(To.Number(1), "Day"),
                Clause.As(To.Number(15.9), "Income"),
                Clause.As(To.String("w1"), "Worker"))),
        Clause.Select(
            Format.List(
                Clause.As(To.Number(1), "Day"),
                Clause.As(To.Number(17.2), "Income"),
                Clause.As(To.String("w2"), "Worker"))),
        Clause.Select(
            Format.List(
                Clause.As(To.Number(2), "Day"),
                Clause.As(To.Number(10.1), "Income"),
                Clause.As(To.String("w1"), "Worker"))),
        Clause.Select(
            Format.List(
                Clause.As(To.Number(3), "Day"),
                Clause.As(To.Number(21), "Income"),
                Clause.As(To.String("w2"), "Worker"))),
        Clause.Select(
            Format.List(
                Clause.As(To.Number(4), "Day"),
                Clause.As(To.Number(8.3), "Income"),
                Clause.As(To.String("w3"), "Worker"))),
        Clause.Select(
            Format.List(
                Clause.As(To.Number(5), "Day"),
                Clause.As(To.Number(-1.2), "Income"),
                Clause.As(To.String("w2"), "Worker"))),
        Clause.Select(
            Format.List(
                Clause.As(To.Number(5), "Day"),
                Clause.As(To.Number(6.3), "Income"),
                Clause.As(To.String("w2"), "Worker"))));

//Let's make a simple pivot query to look at workers' income by days.
var sql =
    Clause.Pivot(
        Clause.Select(
            Format.List(
                "Worker",
                Clause.As("[1]", "[Day 1]"),
                Clause.As("[2]", "[Day 2]"),
                Clause.As("[3]", "[Day 3]"),
                Clause.As("[4]", "[Day 4]"),
                Clause.As("[5]", "[Day 5]")),
            Clause.As(Brackets.Round(income), "inc")),
        Format.Multiline(
            Func.Sum("Income"),
            Logical.ForIn("Day", Format.List("[1]", "[2]", "[3]", "[4]", "[5]"))),
        "pvt");

//Perform the query and print the output.
//It may vary for different ORM and other libraries that support raw queries.
using (var connection = new SqlConnection(connectionStirng))
{
    using (var command = new SqlCommand(sql, connection))
    {
        connection.Open();
        using (var reader = command.ExecuteReader())
        {
            for (var i = 0; i < reader.FieldCount; i++)
            {
                Console.Write(reader.GetName(i));
                Console.Write("\t");
            }
            Console.WriteLine();

            while (reader.Read())
            {
                for (var i = 0; i < reader.FieldCount; i++)
                {
                    Console.Write(reader[i]);
                    Console.Write("\t");
                }
                Console.WriteLine();
            }
        }
    }
}

The outcome will be:

Worker  Day 1   Day 2   Day 3   Day 4   Day 5
w1      15.9    10.1
w2      17.2            21.0            5.1
w3                              8.3

About

A simple raw sql constructor

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages