عملگرهای مجموعه ای در Linq بخش دوم

عملگرهای مجموعه ای در Linq بخش دوم

در ادامه مبحث Union در LINQ مثال دوم را بررسی می کنیم .

در مثال دوم میخواهیم عمل اجتماع را روی لیست محصولات و لیست مشتریان اعمال کنیم . بنابراین نیاز داریم ابتدا لیست مشتریان را تعریف کنیم .

تعریف Customer :

کلاسی بسازید و نام آنرا customer قرار دهید و property های زیر را در آن تعریف کنید :

                              
public class Customer
{
    #region Properties…
    public string CustomerID { get; set; }
    public string CompanyName { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string Region { get; set; }
    public string PostalCode { get; set; }
    public string Country { get; set; }
    public string Phone { get; set; }
    public string Fax { get; set; }
    public List Orders { get; set; }
    #endregion
}

اکنون کلاسی بنام CustomerRepository تعریف کنید و کدهای زیر را در آن بنویسید :

                              
private List _customers;
        public CustomerRepository()
        {
            LoadCustomers();
        }
        private void LoadCustomers()
        {
            _customers = (
 from customerElement in XDocument.Load(@"Datasouce\Customers.xml").Root.Elements("customer")
                            select new Customer
                            {
                                CustomerID = (string)customerElement.Element("id"),
                                CompanyName = (string)customerElement.Element("name"),
                                Address = (string)customerElement.Element("address"),
                                City = (string)customerElement.Element("city"),
                                Region = (string)customerElement.Element("region"),
                                PostalCode = (string)customerElement.Element("postalcode"),
                                Country = (string)customerElement.Element("country"),
                                Phone = (string)customerElement.Element("phone"),
                                Fax = (string)customerElement.Element("fax"),
                                Orders = (
                                    from orderElement in customerElement.Elements("orders").Elements("order")
                                    select new Order
                                    {
                                        OrderID = (int)orderElement.Element("id"),
                                        OrderDate = (DateTime)orderElement.Element("orderdate"),
                                        Total = (decimal)orderElement.Element("total")
                                    }).ToList()
                            }).ToList();
        }
        public IEnumerable GetAll()
        {
            return _customers;
        }

توضیح متد LoadCustomer :

همانطور که در ابتدای این متد مشاهده می کنید ، لیست مشتریان را از یک فایل xml که در پوشه Datasource می باشد خواندیم . ساختار این فایل بصورت زیر است :

                              

        
        ALFKI
        Alfreds Futterkiste
        
Obere Str. 57
Berlin ۱۲۲۰۹ Germany ۰۳۰-۰۰۷۴۳۲۱ ۰۳۰-۰۰۷۶۵۴۵ ۱۰۶۴۳ ۱۹۹۷-۰۸-۲۵T00:00:00 ۸۱۴٫۵۰ ۱۰۶۹۲ ۱۹۹۷-۱۰-۰۳T00:00:00 ۸۷۸٫۰۰ ۱۰۷۰۲ ۱۹۹۷-۱۰-۱۳T00:00:00 ۳۳۰٫۰۰ ۱۰۸۳۵ ۱۹۹۸-۰۱-۱۵T00:00:00 ۸۴۵٫۸۰ ۱۰۹۵۲ ۱۹۹۸-۰۳-۱۶T00:00:00 ۴۷۱٫۲۰ ۱۱۰۱۱ ۱۹۹۸-۰۴-۰۹T00:00:00 ۹۳۳٫۵۰

مشاهده می کنید که ریشه اصلی این ساختار customers است و دارای زیرشاخه هایی بنام customer می باشد . هر customer دارای مشخصاتی مانند شماره تلفن ، ایمیل و غیره می باشد و در نهایت زیرشاخه ای بنام orders دارد که تعیین کننده سفارشات هر مشتری است . هر orders شامل چندین order است که بیانگر جزئیات هر سفارش است (مانند آیدی – تاریخ – قیمت کل)

در متد LoadCustomer ، میخواهیم اطلاعات مشتریان را از این ساختار سلسله مرتبی بیرون بکشیم و به لیست تبدیل کنیم (ToList) .

ادامه عملگر Union :

بعد از تعریف کلاس های Customer , CustomerRepository اکنون تابع Union2 را بصورت زیر تعریف کنید :

                              
public static void Union2()
{
    var products = new ProductRepository().GetAll();
    var customers = new CustomerRepository().GetAll();
    var productFirstChars =
                            from product in products
                            select product.ProductName[0];
    var customerFirstChars =
                            from customer in customers
                            select customer.CompanyName[0];
    var uniqueFirstChars = productFirstChars.Union(customerFirstChars);
    Console.WriteLine("Unique first letters from Product names and Customer names:\n———————————");
    foreach (var character in uniqueFirstChars)
    {
        Console.WriteLine(character);
    }
}

توضیح : ابتدا لیست کامل محصولات و نیز مشتریان را بدست آورده ایم و سپس اولین کاراکتر نام محصول را در متغیر productFirstChars و اولین حرف company را داخل customerFirsthars ریختیم .

 در نهایت لیستی از کاراکترهای غیرتکراری را برمیگرداند که یا در لیست اول است یا دوم و یا هردو .

نکته ۱) : نوع هر دو لیست برای union کردن باید یکی باشد مثلا هر دو int باشند .

نکته ۲) : عملگر union تکراری ها را حذف می کند .

مبحث اجتماع یا Union با پایان رسید . در مقاله بعد در زمینه اشتراک یا Intersect صحبت خواهیم کرد .


تاریخ انتشار : ۲ فروردین ۱۳۹۵



دیدگاه ها :