Linq İle Contains ve Any Metodlarını Kullanarak In Sorgusu Oluşturmak

25.06.2017 Hikmet Okumuş 4470 0 Linq & Lambda


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.




Yorum