LINQ Join(資料物件關聯) ,C#

  • 1821
  • 0
  • 2012-08-26

摘要:LINQ Join(資料物件關聯) ,C#,by-藍小伙

現在要來演示,資料物件間如何來做關聯的簡單範例:

首先先建立資料物件類別

 

//員工類別    
class Employee
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public int OrganizationID { get; set; }
    }
//組織類別
    class Organization
    {
        public string Name { get; set; }
        public int OrganizationID { get; set; }
    }
 
ok 基本類別建立完畢後。
來做些假數據,才可順利跑完範例。(貼在主程序類別內即可)
 
        static List<Employee> _EmployeeList = new List<Employee>()
                                     {
                                         new Employee(){Name = "ACord",OrganizationID = 0 },
                                         new Employee(){Name="Tina",OrganizationID =0},
                                         new Employee(){Name = "Jorad",OrganizationID =3}
                                     };
        static List<Organization> _organizationList = new List<Organization>()
                                     {
                                         new Organization(){Name = "ABB", OrganizationID = 0},
                                         new Organization(){Name="HTC",OrganizationID = 1},
                                         new Organization(){Name = "Nokia",OrganizationID = 2}
                                     };
 
 
從類別中會發現Employee僅有OrganizationID (組織ID),故Employee.OrganizationID 會與Organization.OrganizationID 關聯。
 
 
接下來我們的需求是要將各人員的名稱與組織名稱,依人員名稱順序顯示
所以我們需要再建立一個顯示類別
//用於顯示的類別
    class Display
    {
        public string PersonName { get; set; }
        public string OrganizationName { get;set; }
    }
 
那麼接下來在完成主程序
 
        static void Main(string[] args)
        {
            //LINQ語法
            //from 自定義變數名稱 in 資料陣列
            var empJoinCompanyList = from person in _EmployeeList
                                     //join 自定義變數名稱 in 資料陣列(要關聯的)  on 條件(跟MSSQL 的on使用一樣)
                                     join organization in _organizationList on person.OrganizationID equals organization.OrganizationID
                                      let name = person.Name    //let 選擇類別內的變數名稱
                                     where name != null                //設定要join的條件,若為null 則不join
                                     let s = organization.Name        //let 選擇類別內的變數名稱                                    
                                     where organization.OrganizationID < 3         //設定要join的條件,若>3 則不join
                                     //設定要join的條件,若為null 則不join
                                     select new Display() { PersonName = name, OrganizationName = s };       
            ////同以上LINQ語法功能,以下有使用一些Lamda表達式
            //var empJoinCompanyList=new List<Display>();
            //foreach (var person in _EmployeeList)
            //{
            //    var joinOrganization =
            //        //SingleOrDefault只取一個若取不到直則給Default
            //        _organizationList.SingleOrDefault(
            //        org => org.OrganizationID == person.OrganizationID);
            //    if (joinOrganization==null)
            //    {
            //        continue;
            //    }
            //    if (person.Name != null && joinOrganization.OrganizationID<3)
            //    {
            //        empJoinCompanyList.Add(new Display() { PersonName = person.Name, OrganizationName = joinOrganization.Name });
            //    }
            //}
          
            foreach (var item in empJoinCompanyList)
            {
                Console.WriteLine(item.PersonName+" "+item.OrganizationName);
            }
            Console.ReadKey();
        }
小語:
     在撰寫程式時不需要LINQ與表達式,一樣可把工作順利達成。但是LINQ與表達式可以防止你在撰寫條件時程式碼爆炸的可能性,能大幅的減少原碼的字數,至於原碼的可視度小伙認為是個人經驗的問題,小伙認為還挺簡單扼要的。
 
By- 藍小伙
 
 
(若有錯誤或是更好的方法,煩請不吝指教,歡迎交流。 By-藍小伙)