Merhaba arkadaşlar,

Bir veri kümesinde, where kısıtı ile sonuca dahil etmek istediğimiz ya da dışında tutmak istediğimiz koleksiyon türünde kriterimiz olabilir. SQL de bunu In ya da Exists kullanarak yapabilmekteyiz. Linq karşılığı olarak böyle bir işlem yapmak istediğimizde Contains ya da Any metodları tercih edilebilir. Bir örnek üzerinden detaylandıralım.

Contains İle In Sorgusu Oluşturmak

    static void Main(string[] args)
    {
        using (var context = new NorthwindContext())
        {
            int[] idCollection = { 1, 3, 4, 7 };

            List< Categories> categories = (from x in context.Categories
                                           where idCollection.Contains(x.CategoryID)
                                           select x)
                                           .ToList();

            foreach (var item in categories)
                Console.WriteLine(item.CategoryName);         
        }

        Console.ReadLine();
    }

Örneğimize göre idCollection içerisine, sonuca dahil etmek istediğimiz kategorilerin id değerlerini yazdık. Sonrasında Linq ile sorgularken, idCollection dizisi içerisindeki değer ile eşleşen kayıtları getirmek için Contains metoduna CategoryID bilgisini argüment olarak yazdık. Linq sorgusu çalıştığı zaman bize aşağıdaki gibi bir sonuç döndürecektir.

www.hikmetokumus.com

Biz sorgumuzu içeren olarak yazdık. Eğer tam tersi bir durumda, koleksiyon içerisindeki değerleri içermeyen yani "NOT IN" olarak yazmak için şu şekilde revize etmemiz yeterli olacaktır.

List< Categories> categories = (from x in context.Categories
                               where idCollection.Contains(x.CategoryID) == false
                               select x)
                               .ToList();

www.hikmetokumus.com

Örneği Linq kullanarak yazdık. Lambda ifadesi ile aşağıdaki gibi yazılabilir.

List< Categories> categories = context.Categories.Where(x => idCollection.Contains(x.CategoryID)).ToList();

"NOT IN" için

List< Categories> categories = context.Categories.Where(x => !idCollection.Contains(x.CategoryID)).ToList();

Any İle In Sorgusu Oluşturmak

Daha önce Any kullanımı ile ilgili bir makale yazmıştım. Aşağıdaki linkten ilgili makaleye erişebilirsiniz.

Linq İle Any Metodu Kullanımı

Any metodunu kullanarak Contains ile yaptığımız işlemdeki aynı sonucunu elde edebiliriz.

static void Main(string[] args)
{
    using (var context = new NorthwindContext())
    {
        int[] idCollection = { 1, 3, 4, 7 };

        List< Categories> categories = (from x in context.Categories
                                       where idCollection.Any(f => f == x.CategoryID)
                                       select x)
                                      .ToList();

        foreach (var item in categories)
            Console.WriteLine(item.CategoryName);
    }

    Console.ReadLine();
}

www.hikmetokumus.com

İçermeyen kısıtı için aşağıdaki gibi düzeltme yapılabilir.

List< Categories> categories = (from x in context.Categories
                               where idCollection.Any(f => f == x.CategoryID) == false
                               select x)
                              .ToList();

www.hikmetokumus.com

Her iki yöntem ile de aynı sonucu elde edebiliyoruz. Fakat Entity Framework' ün oluşturduğu sorgular, iki yöntem için de farklılık göstermektedir. Kullanım tercihinizi buna göre yapabilir, aynı zamanda SQL Management - Execution Plan ile performans ve güç tüketimlerini karşılaştırabilirsiniz.

Contains

SELECT 
    [Extent1].[CategoryID] AS [CategoryID], 
    [Extent1].[CategoryName] AS [CategoryName], 
    [Extent1].[Description] AS [Description], 
    [Extent1].[Picture] AS [Picture]
    FROM [dbo].[Categories] AS [Extent1]
    WHERE [Extent1].[CategoryID] IN (1, 3, 4, 7)

Any

SELECT 
    [Extent1].[CategoryID] AS [CategoryID], 
    [Extent1].[CategoryName] AS [CategoryName], 
    [Extent1].[Description] AS [Description], 
    [Extent1].[Picture] AS [Picture]
    FROM [dbo].[Categories] AS [Extent1]
    WHERE  EXISTS (SELECT 
        1 AS [C1]
        FROM  (SELECT 
            1 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]
        UNION ALL
            SELECT 
            3 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable2]
        UNION ALL
            SELECT 
            4 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable3]
        UNION ALL
            SELECT 
            7 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable4]) AS [UnionAll3]
        WHERE [UnionAll3].[C1] = [Extent1].[CategoryID]
    )

Başarılar dilerim.



Kullanıcı Yorumları

hikmet okumuş makale yorum
hatice aydın
25.08.2020 11:21:46

Merhabalar,

 

  1. SELECT   
  2.     [Extent1].[CategoryID] AS [CategoryID],   
  3.     [Extent1].[CategoryName] AS [CategoryName],   
  4.     [Extent1].[Description] AS [Description],   
  5.     [Extent1].[Picture] AS [Picture]  
  6.     FROM [dbo].[Categories] AS [Extent1]  
  7.     WHERE  EXISTS (SELECT   
  8.         1 AS [C1]  
  9.         FROM  (SELECT   
  10.             1 AS [C1]  
  11.             FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]  
  12.         UNION ALL  
  13.             SELECT   
  14.             3 AS [C1]  
  15.             FROM  ( SELECT 1 AS X ) AS [SingleRowTable2]  
  16.         UNION ALL  
  17.             SELECT   
  18.             4 AS [C1]  
  19.             FROM  ( SELECT 1 AS X ) AS [SingleRowTable3]  
  20.         UNION ALL  
  21.             SELECT   
  22.             7 AS [C1]  
  23.             FROM  ( SELECT 1 AS X ) AS [SingleRowTable4]) AS [UnionAll3]  
  24.         WHERE [UnionAll3].[C1] = [Extent1].[CategoryID]  
  25.     )  

bir kaç gündür visual studio'dan yazdığım linq sorgusunun sql karşılığını alabildiğim tool'u arıyorum sizin örneklerde kullandığınız gibi. nereden kullandığınızı öğrenebilir miyim ??

hikmet okumuş makale yorum
Hikmet Okumuş
25.08.2020 13:41:48

 Hatice Aydın merhaba,

Makale üzerindeki sql çıktılarını Profiler (Management Studio) üzerinden aldığımı hatırlıyorum. Fakat bu işlemi doğrudan (EF'ye göre söyleyeceğim, farklı bir orm kullanıyorsanız orada da benzer şekilde araştırma ile query elde edebilirsiniz) context üzerinden gerçekleştirebilirsiniz. Aşağıda örnek 2 link paylaşıyorum. Bu makaleler size yardımcı olacaktır.

https://www.entityframeworktutorial.net/entityframework6/database-command-logging.aspx

https://docs.microsoft.com/tr-tr/ef/ef6/fundamentals/logging-and-interception



Yorum Ekle