Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
C#

C#: Advanced LINQ Query Patterns for Complex Data

- 15.08.26 - ErcanOPAK

🔍 Advanced LINQ = Complex Data

Simple LINQ isn’t always enough. Advanced LINQ patterns handle complex data transformations.

📝 Advanced LINQ Patterns

// Dynamic Query
public IQueryable ApplyFilters(IQueryable query, Dictionary filters)
{
    foreach (var filter in filters)
    {
        var property = typeof(T).GetProperty(filter.Key);
        if (property != null)
        {
            query = query.Where(x => property.GetValue(x).Equals(filter.Value));
        }
    }
    return query;
}

// Expression Tree
public static Expression> BuildPredicate(
    string propertyName, object value)
{
    var parameter = Expression.Parameter(typeof(T));
    var property = Expression.Property(parameter, propertyName);
    var constant = Expression.Constant(value);
    var equal = Expression.Equal(property, constant);
    return Expression.Lambda>(equal, parameter);
}

// Self-Join for Hierarchy
var hierarchy = employees
    .Join(employees,
        e => e.ManagerId,
        m => m.Id,
        (e, m) => new 
        { 
            Employee = e.Name, 
            Manager = m.Name,
            Level = 1
        });

// Cross Join (Cartesian Product)
var combinations = from p in products
                   from c in colors
                   select new { Product = p.Name, Color = c };

// Custom Aggregation
var stats = data
    .GroupBy(x => x.Category)
    .Select(g => new
    {
        Category = g.Key,
        Count = g.Count(),
        Sum = g.Sum(x => x.Value),
        Avg = g.Average(x => x.Value),
        Median = g
            .OrderBy(x => x.Value)
            .Skip(g.Count() / 2)
            .FirstOrDefault()?.Value
    });

🎯 Performance Optimization

// Compile Queries
private static readonly Func> GetUserById =
    EF.CompileAsyncQuery((MyContext ctx, int id) =>
        ctx.Users.FirstOrDefault(u => u.Id == id));

// Batch Operations
var batches = data
    .Select((item, index) => new { item, index })
    .GroupBy(x => x.index / 100)
    .Select(g => g.Select(x => x.item));

// Parallel LINQ
var results = data
    .AsParallel()
    .WithDegreeOfParallelism(Environment.ProcessorCount)
    .Where(x => IsValid(x))
    .Select(x => ProcessItem(x))
    .ToList();

// Caching Results
private static readonly ConcurrentDictionary _cache = new();

public T GetOrAdd(string key, Func factory)
{
    return (T)_cache.GetOrAdd(key, _ => factory());
}

// Efficient Updates
var itemsToUpdate = data
    .Where(x => x.IsActive)
    .Select(x => new 
    { 
        x.Id, 
        UpdatedValue = x.Value * 1.1 
    })
    .ToList();

💡 Advanced LINQ Tips

  • Use compiled queries for EF Core
  • Implement expression trees for dynamic queries
  • Use parallel LINQ for CPU-bound operations
  • Cache frequently used queries
  • Use batch operations for large datasets

Advanced LINQ patterns unlock the full power of data querying. They make complex transformations elegant and efficient.

— Data Engineer

Related posts:

C#: Async/Await Best Practices for High-Performance Apps

C# Primary Constructors: Clean Code Revolution in .NET 8+

C#: Use Pattern Matching for Elegant Code

Post Views: 4

Post navigation

C#: Implementing Retry Patterns with Async/Await
Visual Studio: Task List and TODO Comments for Better Workflow

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

October 2026
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  
« Sep    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (953)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (624)
  • Add Constraint to SQL Table to ensure email contains @ (590)
  • Average of all values in a column that are not zero in SQL (553)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (526)
  • Find numbers with more than two decimal places in SQL (468)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps
  • Photoshop: Fix a Color Profile Mismatch That Makes Printed Output Look Nothing Like What You Saw On Screen
  • WordPress: Fix Search Results That Return Pages From a Theme You Deactivated Months Ago
  • Visual Studio: Fix a Test Project That Builds Fine Alone but Fails to Discover Any Tests After a NuGet Restore
  • ASP.NET Core: Fix a File Upload That Times Out on Slow Connections Only Because Kestrel’s Minimum Data Rate Feature Kicked In
  • JavaScript: Fix an Array Destructuring Default Value That Silently Never Applies Because null Was Passed Instead of Undefined

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (953)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com