PDA

View Full Version : تمرین LINQ



zkazemi
دوشنبه 19 مرداد 1388, 13:23 عصر
در این مثال لیستی از کمپانی ها و در سطح بعدی در داخل این کمپانی ها کارمندان و در سطح برای هر کارمند آدرس رداریم.

http://barnamenevis.org/forum/attachment.php?attachmentid=35060&stc=1&d=1249895945
در این مثال یک ساختار سلسله مراتبی مشاهده می شود.اجازه بدهید ببینیم چطور می تونیم با استفاده از LINQ به جزئیات بالاترین سطح برسیم.
1- جزئیات لیست کارمندان
2- تعداد هر کارمند در هر کمپانی
3- لیست کارمندانی که در بنگالور هستندو
4- لیست کارمندی که بالاترین پرداخت رو در هر کمپانی داشته است .
5- روی هم رفته بالاترین پرداخت کارمند
6- حقوق پرداخت شده توسط کمپانی ها در هر شهر
7- حقوق پرداخت شده توسط هر کمپانی در هر شهر
لیست جزئیات کارمندان
اکنون تمام کارکنان را با نام شرکت و جزئیاتشان لیست خواهیم گرفت :



var EmpDetails = from comp in ListCompany
select new {
Emp = (from emp in comp.ListEmp
select new {
Company = comp.Name,
emp
})
};

در این جا از زیر پرس و جو (subquery)استفاده کردیم . چراکه ما تمام جزئیات کارمند با نام شرکت مربوطه شان را نیاز داریم که هردو در سطحهای مختلف قرار دارند. اول از یک حلقه برای دسترسی به هریک از کمپانی ها در لیست کمپانی استفاده کردیم.


from comp in ListCompany

و سپس برای هر کمپانی انتخاب شده یک حلقه برای هر کدام از کارمندان آن نوشته شده است.

from emp in comp.ListEmp
تعداد کارمندان در هر کمپانی



var LessEmp = from Comp in ListCompany
select new {
Comp.Name,
EmpCount = Comp.ListEmp.Count
};

لیست کارمندانی که در بنگالور هستند
در این جا از عبارت ترکیبی جهت یافتن تمام کارمندانی که در نام شهر محل اقامت انها رشته BAN وجود دارد استفاده شده است:



var EmpInACity = from comp in ListCompany
from emplist in comp.ListEmp
where emplist.Address.City.ToUpper().Contains("BAN")
select new {
CompName = comp.Name,
EmployeeName = emplist.Name
};

در این جا برای پیدا کردن کارمندی که بالاترین پرداخت را داشته ابتدا حلقه ای برای همه کمپانی ها و کارمندان داخل هر یک از کمپانی ها استفاده کردیم . شرط قسمت where تنها کارمندانی را که حقوق آنها معادل حداکثر حقوق پرداختی در کمپانی جاری است را بر می گرداند.



var EmpHighSalEachComp = from comp in ListCompany
from empHigh in comp.ListEmp
where empHigh.salary == comp.ListEmp.Max(
HighEmp => HighEmp.salary)
select new {
CompanyName = comp.Name,
EmpHighName = empHigh.Name,
EmpHighSal = empHigh.salary
};

مثال زبر همون مثال بالا بایک تفاوت در قسمت where میباشد. در این مثال حقوق کارمند با حداکثر حقوق از همه کمپانی ها بررسی می شود.







var EmpHighSal = from comp in ListCompany
from emp in comp.ListEmp
where emp.salary == ListCompany.Max(
TComp => TComp.ListEmp.Max(HighEmp => HighEmp.salary))
select new {
CompanyName = comp.Name ,
EmployeeName = emp.Name,
EmpSal = emp.salary
};

حقوق پرداختی توسط کمپانی ها در هر شهر
در این مثال قصد داریم تا شهر ها رو گروه بندی کرده و مجموع حقوق همه کارمندانی که در آن شهر هستند را محاسبه کنیم.



var CompanyCityWise = from comp in ListCompany


from emp in comp.ListEmp
group emp by emp.Address.City into CityWiseEmp
select new {
State = CityWiseEmp.Key,
TotalSalary = CityWiseEmp.Sum(emp => emp.salary)
};

حقوق پرداخت شده بوسیله هر کمپانی در هر شهر



var CityWiseSalary = from comp in ListCompany
select new {
comp.Name,
Emp =(from emp in comp.ListEmp
group emp by emp.Address.City into CityWiseEmp
select new {
State = CityWiseEmp.Key,
TotalSalary = CityWiseEmp.Sum(emp => emp.salary)
})
};