C# 语言集成查询 LINQ(Language Integrated Query)

提示:如有错误,请不吝指出

文章目录

  • 注意
  • 一、首先声明两个示例集合
  • 二、LINQ多种操作方法
    • 1.Select方法返回基于某具体类型的可枚举集合(指定的所有数据)
    • 2.枚举器返回多个数据项
    • 3.筛选数据
    • 4.排序、分组、聚合数据
    • 5.Join方法联接数据
    • 6.使用查询操作符 这种方法为上述查询方法的简写


注意

注意:

  • 1、在下面示例中的new{}表示的是返回两个或以上数据
  • 2、Select(cust=>cust) 表示返回整行,而不是只投射特定的列
  • 3、无论使用LINQ扩展方法还是查询操作符,当这些在执行的时候,应用程序并不真正构建集合;只有在遍历集合时才会对集合进行枚举,即最终获取到的始终是最新数据
    • =推迟求值策略= 例如,从定义集合到遍历集合,再次期间如果更改address中的数据,就会看到最新的数据。
  • 4、使用ToList方法构建静态List对象以包含数据的缓存拷贝
    • 在定义LINQ查询是强制求值,生成一个静态的缓存的集合,该集合是原始数据的拷贝,如果原始集合中的数据发生改变,该拷贝中的数据不会发生改变
      * eg:…from a in address.ToList() select a.CompanyName;

一、首先声明两个示例集合

			var customers = new[]
            {
                new {CustomerID=1,FirstName="Kinm",LastName="AberCrim",CompanyName="Alpine"},
                new {CustomerID=2,FirstName="Jeff",LastName="Hay",CompanyName="Coho"},
                new {CustomerID=3,FirstName="Charlie",LastName="Herb",CompanyName="House"}
            };
            var address = new[] {
                new {CompanyName="Alpine",City="Berne",Country="Land"},
                new {CompanyName="A",City="B",Country="Land"},
                new {CompanyName="Coho",City="San",Country="US"},
                new {CompanyName="Trey",City="Microsoft",Country="London"}
            };

二、LINQ多种操作方法

1.Select方法返回基于某具体类型的可枚举集合(指定的所有数据)

Select其实是IEnumerable类的扩展方法,IEnumerable类System.Linq命名空间;在该命名空间中可以查看Enumerable.Select方法定义

IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName);

// 后面的同理,使用foreach遍历可枚举集合
foreach (string name in customerFirstNames)
{
    Console.WriteLine(name);
}

2.枚举器返回多个数据项

方法1:将名字和姓氏连接成单个字符串

IEnumerable<string> customerName=customers.Select(cust => $"{cust.FirstName} {cust.LastName}");

方法2:定义新类型来封装多个数据项,并用Select方法构造该类型的实例

IEnumerable<FullName> customerFullNames = customers.Select(cust => new FullName { FirstName = cust.FirstName, LastName = cust.LastName });

//class FullName
//{
  // public string FirstName { get; set; }
   //public string LastName { get; set; }
//}

方法3:使用匿名数组以及var

var customerFullName = customers.Select(data => new { FirstName = data.FirstName, LastName = data.LastName });

3.筛选数据

			// 筛选数据
            // 要正确理解方法的应用顺序
            // 先应用where方法,筛选出符合条件的行;再应用Select方法,从而指定其中特定的字段
            #region 筛选数据
            Console.WriteLine("====================================================================================");
            IEnumerable<string> usCompanies = address
                .Where(addr => string.Equals(addr.Country, "London"))
                .Select(usComp => usComp.CompanyName);
            foreach (string name in usCompanies)
            {
                Console.WriteLine(name);
            }
            #endregion

4.排序、分组、聚合数据

			#region 排序、分组、聚合数据
            // 使用OrderBy方法:按特定顺序获取数据(升序)
            // OrderByDescending方法(降序)
            // 按多个键来排序,在OrderBy方法或OrderByDescending方法之后使用ThenBy或ThenbyDescending方法
            IEnumerable<string> companyNames = address.OrderBy(addr => addr.CompanyName).Select(comp => comp.CompanyName);
            foreach (string name in companyNames)
            {
                Console.WriteLine(name);
            }

            Console.WriteLine();


            // 使用GroupBy方法:按一个或多个字段中共同的值对数据进行分组(本例按国家对数组中的公司进行分组)
            var CompaniesGroupByCountry=address.GroupBy(addrs => addrs.Country);  // 返回可枚举集合中 的 所有行  都依据该方法所指定的字段进行分组(多行数据)
            foreach (var companiesPerCountry in CompaniesGroupByCountry)  // 逐行遍历
            {
                // Key字段访问作为分组依据的值,Count为数目 Max Min等
                Console.WriteLine($"Country:{companiesPerCountry.Key}\t{companiesPerCountry.Count()}");
                foreach (var companies in companiesPerCountry)  // 遍历当前行的所有数据
                {
                    Console.WriteLine($"\t{companies.CompanyName}");
                }
            }


            // 注意,该汇总方法不会区分包含相同值的字段
            int numberOfCompanies=address.Select(addr => addr.CompanyName).Count();
            Console.WriteLine($"Number of companies:{numberOfCompanies}");


            // 使用Distinct方法删除重复
            int numberOfDistinctCountries = address.Select(addr => addr.Country).Distinct().Count();
            Console.WriteLine($"Number of distinct countries: {numberOfDistinctCountries}");

            #endregion

5.Join方法联接数据

			#region Join方法联接数据
            // 两个数组的匹配键是CompanyName,Select方法指定customers数组中感兴趣的字段(FirstName,LastName),以及指定了作为匹配键使用的字段CompanyName
            // 然后使用Join方法将Select标识的数据同另一个可枚举集合联接起来
            // Join方法的参数:
            // 1.要连接的目标可枚举集合
            // 2.一个对 Select方法标识数据 中的匹配键字段进行标识的方法
            // 3.一个对 目标集合 中的匹配键字段进行标识的方法
            // 4.一个对 Join方法返回的结果集合 中的 列 进行了标识的方法
            var companiesAndCustomers = customers
                .Select(c => new { c.FirstName, c.LastName, c.CompanyName })
                .Join(address, custs => custs.CompanyName, addrs => addrs.CompanyName,
                (custs, addrs) => new { custs.FirstName, custs.LastName, addrs.Country });

            foreach (var row in companiesAndCustomers)
            {
                Console.WriteLine(row);
            }

            // 本例通过Join方法将两个数组联接起来,联接依据就是两个数组中的CompanyName字段值匹配,结果集合包含customers数组的FirstName字段和LastName字段以及address数组中的Country字段
            #endregion

6.使用查询操作符 这种方法为上述查询方法的简写

			#region 使用查询操作符 这种方法为上述查询方法的简写,便于开发
            // 获取每个客户的名字
            var customersName=from cust in customers select cust.FirstName;
            //Select(cust=>cust):返回整行,而不是特定的列
            //var customersName1 = from cust in customers select cust;
            //foreach (var item in customersName1)
            //{
            //    Console.WriteLine(item);
            //}

            // 获取每个客户的名字和姓氏
            var customerNames=from a in customers select new {a.FirstName,a.LastName};

            // 筛选数据用where (需要注意的是,在这里筛选出来的数据为集合,需要使用循环遍历输出)
            var usCompanies2 = from b in address where String.Equals(b.Country, "London") select b.CompanyName;
            
            // 数据排序用orderby              (根据CompanyName字段进行排序,然后获取排序后的CompanyName字段)
            var companyNames2=from a in address orderby a.CompanyName select a.CompanyName;

            // 数据分组用group
            // 可以使用和以前一样的循环遍历结果
            var companiesGroupedByCountry = from a in address group a by a.Country;
            
            // Count方法
            int number1=(from a in address select a.CompanyName).Count();

            // Distinct方法 忽略重复值
            int number2=(from a in address select a.Country).Distinct().Count();

            // 统计集合中的行数
            int sumRows = address.Count();

            // Join操作符根据一个匹配键来联接两个集合  on和equals操作符指定两个集合如何关联 注意equals左边为“源”右边为“目标”
            // 当返回两个及以上数据的时候,使用new{}来进行返回
            var citiesAndCustomers = from a in address join c in customers on a.CompanyName equals c.CompanyName select new { c.FirstName, c.LastName, a.Country };


            #endregion

你可能感兴趣的:(C#,linq,c#,数据库,.net)