DEV Community

Cover image for Learning LINQ with 101 Examples and Sample Data (Query & Fluent Syntax)
Jose Maria Iriarte
Jose Maria Iriarte

Posted on • Edited on

Learning LINQ with 101 Examples and Sample Data (Query & Fluent Syntax)

One of the most useful skills you can learn as a .NET developer is LINQ (Language-Integrated Query) syntax. With LINQ you can query collections like lists and arrays.

I forked a project from Microsoft’s official 101 LINQ examples, adding data so that you can now see what is being queried and can make better sense of the results.

I also gave variables more meaningful names. This should help you read query syntax better.

This repo is ideal for beginners with a basic understanding of C# syntax who also want to learn LINQ

To get started, clone the repository to get it in your local computer. Doing so is easy. Instructions are provided in the following link:

How to clone a repository

The repo in question is as follows:

GitHub logo tigerbluejay / FullLINQ101Implementations

A .NET 6 project featuring complete implementations of Microsoft's original 101 LINQ examples. Adds model-backed data, clearer variable naming, and fluent syntax alternatives for deeper learning.

Full LINQ 101 Implementations

This project is a fork of the original 101 LINQ Examples by Microsoft.

The 101 LINQ Examples by Microsoft is a collection of queries that demonstrate the full power of LINQ syntax. These examples utilize mainly query style syntax and some times, when there is no alternative, fluent syntax.

This project maintains the core queries intact except for some variable renaming to improve readability, and its main contribution is the addition of relevant models such as Product, Order and Customer, which should allow you understand how queries work when using custom classes.

Thus, there are now method definitions initializing classes with data which map to the empty method calls in the original examples.

In addition, fluent syntax alternatives have been appended to the original queries provided by Microsoft, which have been modified to be comments where appropriate.

Project Organization

The project is organized…

You’ll find the Solution contains 14 projects, each dealing with a different type of query.

Each project contains a number of LINQ examples.

A sample query with some context is as follows:

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

var lowNumbers = from number in numbers
                 where number < 5
                 select number;

Console.WriteLine("Numbers < 5:");
foreach (var lowNumber in lowNumbers)
{
    Console.WriteLine(lowNumber);
}
Console.ReadKey();
Enter fullscreen mode Exit fullscreen mode

Simply,

  • We have an int array with the name "numbers".
  • The query evaluates every number from the numbers array.
  • The query then selects the numbers that match the condition of being less than 5.
  • The new collection is saved into var lowNumbers.
  • var lowNumbers can then be iterated, printing to the console each number.

This is straightforward and requires solely the effort of getting used to LINQ query syntax.

So not too complicated. But what do you do if you are working with lists and not arrays?

This is where this repo is useful.

Consider querying a list:

List<Product> products = GetProductList();

var soldOutProducts = from product in products
                      where product.UnitsInStock == 0
                      select product;

Console.WriteLine("Sold out products:");
foreach (var soldOutProduct in soldOutProducts)
{
    Console.WriteLine($"{soldOutProduct.ProductName} is sold out!");
}
Console.ReadKey();
Enter fullscreen mode Exit fullscreen mode

The example is similar to the array example above. Only this time we are iterating not through an explicit array but through a list and finding products where UnitsInStock are 0.

To aid you in verifying your understanding of the query, I have added a definition for the GetProductList() method.

To do so, I first had to define a model within the project, which is as follows:

   internal class Product
    {
        public string ProductName { get; set; }
        public int UnitsInStock { get; set; }
        public decimal UnitPrice { get; set; }
    }
Enter fullscreen mode Exit fullscreen mode

And within the example, I initialized the list with dummy data.

List<Product> GetProductList()
{
    List<Product> productsList = new List<Product>();
    productsList.Add(new Product 
{ ProductName = "Product 1", UnitsInStock = 3, UnitPrice = 3.00m });

    productsList.Add(new Product 
{ ProductName = "Product 2", UnitsInStock = 0, UnitPrice = 4.00m });

    productsList.Add(new Product 
{ ProductName = "Product 3", UnitsInStock = 5, UnitPrice = 6.00m });

    productsList.Add(new Product 
{ ProductName = "Product 4", UnitsInStock = 1, UnitPrice = 1.00m });

    productsList.Add(new Product 
{ ProductName = "Product 5", UnitsInStock = 0, UnitPrice = 2.00m });

    productsList.Add(new Product 
{ ProductName = "Product 6", UnitsInStock = 2, UnitPrice = 1.00m });

    productsList.Add(new Product 
{ ProductName = "Product 7", UnitsInStock = 0, UnitPrice = 7.00m });

    productsList.Add(new Product 
{ ProductName = "Product 8", UnitsInStock = 3, UnitPrice = 8.00m });


    return productsList;
}
Enter fullscreen mode Exit fullscreen mode

From the list we see that products 2, 5 and 7 have 0 UnitsInStock. Thus, we now know what to expect in the console if we understood the query correctly.

Console output is as follows for that example:

Sold out products:
Product 2 is sold out!
Product 5 is sold out!
Product 7 is sold out!
Enter fullscreen mode Exit fullscreen mode

And so on and so it goes for all projects. In each project you will find examples defined in Program.cs and then a folder containing the model(s) used in that particular project.

The examples that deal with lists all reference a method where I initialize a list of some sort with dummy data. Just like in the example above.

Although the projects are ordered alphabetically and can be reviewed in any order, it is best to start with the LINQRestrictionOperators Project, then the LINQProjectionOperators Project, to understand basic where and select clauses. Then move to whichever project interests you the most.

Enjoy!

PS: I've added fluent syntax implementations for the queries where convenient. Where fluent syntax implementations exist, the query syntax version of the queries have been commented.

For example, in the example above, we now have:

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

//var lowNumbers = from number in numbers
//                 where number < 5
//                 select number;

var lowNumbers = numbers.Where(number => number < 5).Select(number => number);

Console.WriteLine("Numbers < 5:");
foreach (var lowNumber in lowNumbers)
{
    Console.WriteLine(lowNumber);
}
Console.ReadKey();
Enter fullscreen mode Exit fullscreen mode

Continue Your LINQ Journey!

You've just unlocked 101 LINQ examples to kickstart your learning! Now, let’s keep the momentum going and make the most of these examples.

👉 Here's how you can stay engaged:

👍 Like this article if you found it useful and would like to see more tutorials on C# and LINQ.

🔖 Bookmark this page so you can easily reference it when you're practicing LINQ.

Star the GitHub repo to show your support and stay updated with future improvements.

📢 Share this article with friends or colleagues who are learning LINQ or .NET – let's spread the knowledge!

Top comments (1)

Collapse
 
hosseinmolaei profile image
Hossein Molaei

that's great 👌