چگونگی استفاده از دستورات sql در LINQ

SQL در Linq

در این مقاله با هم به سراغ چگونگی استفاده از دستورات SQL در LINQ خواهیم رفت.کد های مربوطه با مراحل انجام کار به صورت گام به گام برایتان قرار داده شده است. ابتدا بیاید با یک مقدمه کوتاه شروع کنیم …

SQL در LINQ

من در یک مصاحبه سوالی پرسیدم :

ما می تونیم از Like در LINQ استفاده کنیم با همان قابلیت های SQL ؟

میگی نه؟ این متن رو بخون اون وقت میگی آره !

اول بزار ببینیم که چه جوری می تونیم همه ی این هارو با قابلیت ها در LINQ بدست بیاریم !

var authors = new List<string> { "Gaurav Kumar Arora", "Mahesh Chand", "Shivprasad Koirala", "Sumit Jolly", "Sukesh Marla", "Rj Nitin" };

از لیست بالا، باید Mahesh Chand را پیدا کنیم :

//This will return 'Mahesh Chand'  
var author = authors.Where(a => a.ToLower().Contains("mahesh"));  

هم چنین ما می تونیم از StartWith و EndWith استفاده کنیم که predicate هستند، مثل زیر :

//It will works as: where a LIKE '%manish'  
var author = authors.Where(a => a.ToLower().StartsWith("manish")); 

خروجی بالا: Mahesh Chand

//It will works as: where a LIKE 'manish%'  
var author = authors.Where(a => a.ToLower().EndsWith("manish"));  

خروجی بالا: Mahesh Chand.

در هر دو صورت خروجی یک چیز خواهد بود چون که اطلاعات یک جور بودند.

اگر شما از LINQ-to-Sql or Entity Framework by adding following namespace you can do the everything: استفاده می کنید خوش شانس هستید.

using System.Data.Linq.SqlClient;

و حالا حل شد.

var author = from a in authors  
                   where SqlMethods.Like(a, "%/Mahesh/%")  
                   select a;  

یا از Lambda استفاده کنید:

var author = authors.Where(a => SqlMethods.Like(a, "%/Mahesh/%"));

به شرایطی فکر کنید که شما مجبور بودید از سناریو های پیچیده استفاده کنید نمی توستید از namespace بالا استفاده کنید.

متاسفانه LINQ اینجا نمی تونه شما رو کمک کنه

برای حل این مشکل می تونیم یک متود گسترش (Extension Method) مثل زیر بسازیم :

public static class SqlExtensionMethod  
    {  
        public static bool SqlLike(this string value, string likeTerm)  
        {  
            var regex = new Regex(string.Format("^{0}$", likeTerm.Replace("*", ".")), RegexOptions.IgnoreCase);  
            return regex.IsMatch(value ?? string.Empty);  
        }  
    }  

من این رو یک جادو فرض می کنم ، حالا ما می تونیم از قابلیت های LIKE استفاده کنیم :

var author = from a in authors  
                        where a.SqlLike("*mah*chand*")   
                        select a;  

و از Lambda استفاده کنیم :

var author = authors.Where(a => a.SqlLike("*mah*chand*"));

اینجا کد رو نیشگون (tweak) می گیریم (از tweak استفاده می کنیم) :

public static IEnumerable<string> SqlLike(this IEnumerable<string> source, string expression)  
        {  
            return from s in source   
                   where s.SqlLike(expression)   
                   select s;  
        }  

حالا این کار رو انجام میدیم :

var author = authors.SqlLike("*mah*chand*");

این هم یک extension class کامل

public static class SqlExtensionMethod  
    {  
        public static bool SqlLike(this string value, string likeTerm)  
        {  
            var regex = new Regex(string.Format("^{0}$", likeTerm.Replace("*", ".")), RegexOptions.IgnoreCase);  
            return regex.IsMatch(value ?? string.Empty);  
        }  
  
        public static IEnumerable<string> SqlLike(this IEnumerable<string> enumerable, string expression)  
        {  
           return enumerable.Where(s => s.SqlLike(expression));  
        }  
  
        public static IEnumerable<string> SqlLike_Old(this IEnumerable<string> enumerable, string expression)  
        {  
            return from s in enumerable  
                   where s.SqlLike(expression)  
                   select s;  
        }  
    }  

تموم شد !

حالا Linq queries ما از قابلیت های برابر با sql LIKE استفاده می کنه .

داریوش فرخی

داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.