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.
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();
Ö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(); }
İç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();
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.