Temiz LINQ Sorguları için Kurallar

Posted by

Merhaba arkadaşlar, bu yazımda sizlere Temiz LINQ Sorgularını nasıl yazabiliriz, dikkat edeceğimiz ve etmemiz gereken kurallar neler bunlardan bahsedeceğim.

  1. Sorguları Mantıklı Parçalara Ayırın:
    Uzun ve karmaşık sorgular, kodun okunabilirliğini azaltabilir. Bu nedenle, sorgularınızı mantıklı parçalara ayırmak önemlidir. Her bir parça, tek bir görevi gerçekleştirmeli ve anlamlı bir isme sahip olmalıdır. Bu, sorgunun amacını daha hızlı anlamanıza yardımcı olur ve kodunuzun bakımını kolaylaştırır.
var activeUsers = context.Users.Where(u => u.IsActive);
var adultUsers = activeUsers.Where(u => u.Age >= 18);
var sortedUsers = adultUsers.OrderBy(u => u.FirstName)
                            .ThenBy(u => u.LastName)
                            .Include(u => u.Roles)
                            .AsNoTracking();
var nameList = sortedUsers.Select(u => new { u.FirstName, u.LastName }).ToList();

2. Lazy Loading’i Optimize Edin:

Linq sorguları varsayılan olarak “lazy loading” yapısını kullanır, yani veritabanından sadece gerektiğinde veri alır. Ancak, bazen gereksiz yere veri alımını tetikleyebilir veya performans sorunlarına neden olabilir. Bu durumu önlemek için, sorgularınızı optimize etmek için Include() ve AsNoTracking() gibi yöntemleri kullanabilirsiniz.

var activeUsers = context.Users.Where(u => u.IsActive);
var adultUsers = activeUsers.Where(u => u.Age >= 18);
var sortedUsers = adultUsers.OrderBy(u => u.FirstName)
                            .ThenBy(u => u.LastName)
                            .Include(u => u.Roles)
                            .AsNoTracking();
var nameList = sortedUsers.Select(u => new { u.FirstName, u.LastName }).ToList();

3. Etkili Filtreleme ve Sıralama Yöntemlerini Kullanın:

Linq, birçok farklı filtreleme ve sıralama yöntemi sunar. Sorgularınızda en etkili yöntemleri kullanmak, performansı artırabilir. Örneğin, Contains() yerine Any(), Single() yerine FirstOrDefault() gibi yöntemler performans açısından daha iyidir.

var activeUsers = context.Users.Where(u => u.IsActive);
var adultUsers = activeUsers.Where(u => u.Age >= 18);
var sortedUsers = adultUsers.OrderBy(u => u.FirstName)
                            .ThenBy(u => u.LastName)
                            .Include(u => u.Roles)
                            .AsNoTracking();
var nameList = sortedUsers.Select(u => new { u.FirstName, u.LastName }).ToList();

4. IQueryable<T> Kullanın:

Linq sorgularında IQueryable<T> türünü kullanmak, sorguların veritabanında gerçekleştirilmesini sağlar. Bu, verilerin sorgu tarafında değil, veritabanı tarafında işlenmesini sağlayarak performansı artırır. Bu nedenle, mümkün olduğunda IQueryable<T> kullanmayı tercih etmek önemlidir.

// Kötü Uygulama
List<User> users = context.Users.ToList(); // Tüm kullanıcıları veritabanından alır

// İyi Uygulama
IQueryable<User> usersQuery = context.Users; // Sorguyu veritabanına iletir
List<User> users = usersQuery.ToList(); // Sorguyu yürütür ve sonuçları alır

5. Join ve GroupBy Kullanımını İyileştirin:

// Kötü Uygulama
var query = from user in context.Users
            join role in context.Roles on user.RoleId equals role.Id
            where user.IsActive
            select new { user.Name, role.RoleName };

// İyi Uygulama
var query = from user in context.Users
            join role in context.Roles on user.RoleId equals role.Id into roles
            where user.IsActive
            select new { user.Name, Roles = roles.Select(r => r.RoleName) };

6. Select Operatörünü Dikkatli Kullanın:

// Kötü Uygulama
var query = from user in context.Users
            where user.IsActive
            select new { user.Id, user.Name, user.Email, user.Password }; // Gereksiz sütunlar seçiliyor

// İyi Uygulama
var query = from user in context.Users
            where user.IsActive
            select new { user.Id, user.Name }; // Sadece gerekli sütunlar seçiliyor

7. Düzgün Hata Yönetimi ve İstisna İşleme:

try
{
    var user = context.Users.FirstOrDefault(u => u.Id == userId);
    if (user != null)
    {
        // Kullanıcı bulundu, işlemleri devam ettir
    }
    else
    {
        // Kullanıcı bulunamadı, uygun geri bildirim sağla
    }
}
catch (Exception ex)
{
    // Hata yakalandı, uygun şekilde işle
    Console.WriteLine("Hata oluştu: " + ex.Message);
}

8. Performans İyileştirmeleri:

// Kötü Uygulama
var userCount = context.Users.Count(); // Tüm kullanıcıları veritabanından alır ve sayar

// İyi Uygulama
var userCount = context.Users.LongCount(); // Sadece kullanıcı sayısını veritabanından alır

Bu örnekler, Linq sorgularının daha iyi performans göstermesi için bazı ek kuralları göstermektedir. Tabii ki, her proje ve durum farklı olabileceği için, projenizin gereksinimlerine ve veritabanı yapısına göre uygun kuralları seçmek önemlidir.

Umarım faydalı olur.

Bir sonraki yazıda görüşmek üzere…

Leave a Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir