۱۳۸۹/۰۶/۲۱

آموزش LINQ-قسمت پنجم: عملگرهای اتصال و دسته بندی


نکته خیلی مهم : این پست برای مطالعه توصیه نمی شود برای  یادگیری LINQ می توانید به " دوره آموزشی LINQ " مراجعه کنید.




عملگرهای اتصال Join Operators
این عملگرها برای متحد کردن چند منبع داده که دارای اشتراکاتی هستند ،استفاده می شود.عملگرهای اتصال در LINQ  دقیقا همانند عملگرهای اتصال در SQL عمل می کنند.هر منبع داده ویژگی های کلیدی را دارا می باشد که بوسیله آنها می توان داده ها را مقایسه و جمع آوری نمود.
عملگر Join
این عملگر همانند INNER Join در پایگاه داده های رابطه ای عمل می کند یعنی دو مجموعه را بر اساس کلیدهای که در هر دو مرتبط هستند و به عنوان آرگومان به آن ارسال می گردد،ترکیب می کند.این عملگر به فرم زیر است(بدون سربارگذازی):

public static IEnumerable<V> Join<T, U, K, V>(
 this IEnumerable<T> outer,
 IEnumerable<U> inner,
 Func<T, K> outerKeySelector,
 Func<U, K> innerKeySelector,
 Func<T, U, V> resultSelector);

همانطور که مشاهده می کنید عملگر Join نیاز به مقدار دهی چهار نوع عام دارد.T نشان دهنده نوع منبع داده خارجی (outer) و U نشان دهنده نوع منبع داده داخلی (inner) است . outerKeySelector و innerKeySelector تعیین می کنند که داده ها چطور از منابع inner و outer استخراج گردند . هردو اینها از نوع K می باشند که تعادل میان این دو، شرط Join را پدید می آورد.تابع  resultSelector که به عنوان آخرین پارامتر تعیین شده است برای جفت عناصر داخلی و خارجی (تطابق داده شده)بررسی شده و شئ نتیجه برگردانده می شود.
عملگر Join ترتیب عناصر خارجی را حفط میکند و همچنین برای هر عنصر خارجی، ترتیب عناصر تطبیق داده شده داخلی را حفظ میکند.
در پایگاه داده های رابطه ای عملگرهای Join دیگری همانند left outer joins وجود دارد ولی این نوع اتصالات به صورت صریح درLINQ پیاده سازی نشده ولی در زیر مجموعه قابلیت های عملگر GroupJoin قرار دارند.
در عبارت زیر اشیاء Customerو Order با توجه به مقدار CustomerID به هم دیگر متصل می شوند و در خروجی شئ داریم که شامل نام مشتری و جمع کل سفرش و تاریخ آن است.
var custOrders =
 customers.
 Join(orders, c => c.CustomerID, o => o.CustomerID,
  (c, o) => new { c.Name, o.OrderDate, o.Total }
 );

نمونه عبارت پرس وجوی آن به صورت زیر است
var custOrders =
 from c in customers
 join o in orders on c.CustomerID equals o.CustomerID
 select new { c.Name, o.OrderDate, o.Total };

نکته مهم:در هنگام نوشتن شرط در عبارت پرس و جو توجه کنید که ابتدا می بایست نوع خروجی و سپس مقدار ورودی را قید کنید در غیر اینصورت عبارت پرس و جو کامپایل نمی شود مثلا در عبارت بالا مقدار CustomerID شئ customers (اول) با مقدار CustomerID شئ orders بررسی می شود.

عملگر GroupJoin
از این عملگر زمانی بخواهیم انواع خاصی از Joinها را پیاده سازی کنیم ،که قبلا نیز به آن اشاره کردیم ، همانند left outer joins .
فرم کلی این عملگر به صورت زیر است
public static IEnumerable<V> GroupJoin<T, U, K, V>(
 this IEnumerable<T> outer,
 IEnumerable<U> inner,
 Func<T, K> outerKeySelector,
 Func<U, K> innerKeySelector,
 Func<T, IEnumerable<U>, V> resultSelector);
مثال inner Join
var custTotalOrders =
 from c in customers
 join o in orders on c.CustomerID equals o.CustomerID into co
 from o in co.DefaultIfEmpty(emptyOrder)
 select new { c.Name, o.OrderDate, o.Total };
توجه کنید که می توان به وسیله متد DefaultIfEmpty می توان کلیه عناصر تهی را با مقداری معین جایگزین نمود.

عملگرهای دسته بندی
این نوع عملگر ها برای دسته بندی عناصر بسته به یک کلید درونی مورد استفاده قرار می گیرند.

عملگر GroupBy
این عملگر ،عناصر یک مجموعه را بر اساس یک تابع گذینشی داده شده دسه بندی می کند که دقیقا مشابه عملکرد عبارت GroupBy در SQL است.
فرم کلی این عملگر به صورت زیر است
public static IEnumerable<IGrouping<K, T>> GroupBy<T, K>(
 this IEnumerable<T> source,
 Func<T, K> keySelector);

public static IEnumerable<IGrouping<K, T>> GroupBy<T, K>(
 this IEnumerable<T> source,
 Func<T, K> keySelector,
 IEqualityComparer<K> comparer);

public static IEnumerable<IGrouping<K, E>> GroupBy<T, K, E>(
 this IEnumerable<T> source,
 Func<T, K> keySelector,
 Func<T, E> elementSelector);

public static IEnumerable<IGrouping<K, E>> GroupBy<T, K, E>(
 this IEnumerable<T> source,
 Func<T, K> keySelector,
 Func<T, E> elementSelector,
 IEqualityComparer<K> comparer);

public interface IGrouping<K, T> : IEnumerable<T>
{
 K Key { get; }
}

مثال1
List<Customer> customers = new List<Customer>
{
   New Customer { CustomerID =0,Name =”Ali”},
   New Cusyomer { CustomerID =2,name=”Ahmad”},
   New Customer { CustomerID =3,name=”Reza”}
};

List<Customer> customs = customers.GroupBy(c=> c.Name);
عبارت بالا معدل عبارت زیر است
List<Customer> customs = from c in customers
Group c by c.Name;
مثال 2
List<Customer> customs = from c in customers
Group new {c.Name ,c.Region}
By c.Country;
که معادل عبارت زیر است
List<Customer> customs= customers.GroupBy(c=> c.Country , new {c.Name ,c.Region});
Vote on iDevCenter

هیچ نظری موجود نیست:

ارسال یک نظر