学完了Linq的核心原理的实与性能的分析,我们可以更加合理的使用Linq,其帮助我们完成功能。 那么真正实现功能的时候,往往使用的是查询表达式的语法规则,这样更加便于读写。那么现在就写几个例子来看看真正的实现方式,与实际应用方式:

简单得查询不多做实例了,主要练习一下新的实例

1、let子句

这let更像一个范围变量,只在表达式中有效,例子:

  1. //这里就提供了一个范围变量n,来实现判断的用法(虽然多此一举)
  2. int[] arr = new[] {0, 1, 2, 3, 4, 5, 6, 7};
  3. var query = from a in arr
  4. let n = a % 2
  5. where n == 0
  6. select a;

2、OrderBy排序 (关键字descending 降序排列, ascending升序排列。)

  1. int[] arr = new[] {0, 1, 2, 3, 4, 5, 6, 7};
  2. var query = from a in arr
  3. orderby a descending
  4. select a;

3、GroupBy分组

  1. int[] arr = new[] {0, 1, 2, 3, 4, 5, 6, 7};
  2. var query =
  3. from a in arr
  4. group a by a % 2 == 0;
  5. //返回值为两个分组的序列

4、Into临时标识符

Into用于创建一个临时的标识符,指针去指向一个序列或集合。也相当与合并了两个序列。

  1. int[] arr = new[] {0, 1, 2, 3, 4, 5, 6, 7};
  2. var query =
  3. from a in arr
  4. group a by a % 2 == 0 into g
  5. from sn in g
  6. select sn;

5、join联合查询

由条件关联两个表。

  1. int[] arr = new[] {0, 1, 2, 3, 4, 5, 6, 7};
  2. int[] arr1 = new[] {0, 2 , 4};
  3. var query1 = from a in arr
  4. join b in arr1 on a equals b
  5. select a;

Linq的综合案例

查询一系列的语言,并按照长度进行分组,然后进行升序排列

  1. string[] languane = { "java", "C#", "C++", "python", "golang" };
  2. var query = from a in languane
  3. group a by a.Length into g
  4. orderby g.Key
  5. select g;
  6. foreach (var items in query)
  7. {
  8. Console.WriteLine(items.Key);
  9. foreach (var item in items)
  10. {
  11. Console.WriteLine(item);
  12. }
  13. }

建立例子

定义类

  1. //大侠
  2. public class MartialArtsMaster
  3. {
  4. public int Id { get; set; }
  5. public string Name { get; set; }
  6. public int Age { get; set; }
  7. public string Menpai { get; set; }
  8. public string Kongfu { get; set; }
  9. public int Level { get; set; }
  10. }
  11. //功夫
  12. class Kongfu
  13. {
  14. public int KongfuId { get; set; }
  15. public string KongfuName { get; set; }
  16. public int Lethality { get; set; }
  17. }

实例化

  1. //初始化大侠
  2. var master = new List<MartialArtsMaster>()
  3. {
  4. new MartialArtsMaster(){Id = 1,Name = "黄蓉",Age = 8,Menpai = "丐帮",Kongfu = "打狗棒法",Level = 9 },
  5. new MartialArtsMaster(){Id = 2,Name = "洪七公",Age = 70,Menpai = "丐帮",Kongfu = "打狗棒法",Level = 10 },
  6. new MartialArtsMaster(){Id = 3,Name = "郭靖",Age = 22,Menpai = "丐帮",Kongfu = "降龙十八掌",Level = 10 },
  7. new MartialArtsMaster(){Id = 4,Name = "任我行",Age = 50,Menpai = "明教",Kongfu = "葵花宝典",Level = 1 },
  8. new MartialArtsMaster(){Id = 5,Name = "东方不败",Age = 35,Menpai = "明教",Kongfu = "葵花宝典",Level = 10 },
  9. new MartialArtsMaster(){Id = 6,Name = "林平之",Age = 23,Menpai = "华山",Kongfu = "葵花宝典",Level = 7 },
  10. new MartialArtsMaster(){Id = 7,Name = "岳不群",Age = 50,Menpai = "华山",Kongfu = "葵花宝典",Level = 9 }
  11. };
  12. //初始化武学
  13. var Kongfu = new List<Kongfu>()
  14. {
  15. new Kongfu(){KongfuId = 1, KongfuName = "打狗棒法" , Lethality = 90},
  16. new Kongfu(){KongfuId = 2, KongfuName = "降龙十八掌" , Lethality = 95},
  17. new Kongfu(){KongfuId = 3, KongfuName = "葵花宝典" , Lethality = 100}
  18. };

1、在武林大侠中选出Level大于8级且门派为丐帮的大侠

var sequence = from a in master
    where a.Level > 8 && a.Menpai == "丐帮"
    select a;
var sequenceMethod = master.Where(x => x.Level > 8 && x.Menpai == "丐帮");

2、过滤所学武功杀伤力大于90的大侠,且按等级进行升序排序。

var sequence1 = (
    from a in master
    from b in Kongfu
    where b.Lethality > 90 && a.Kongfu == b.KongfuName
    orderby a.Level
    select new
           {
               a.Id,
               a.Name,
               a.Kongfu,
               a.Level,
               a.Menpai,
           });
var sequence1Method = master.SelectMany(k => Kongfu, (m, k) => new { mt = m, kf = k })
                .Where(x => x.kf.Lethality > 90 && x.kf.KongfuName == x.mt.Kongfu)
                .OrderBy(m => m.mt.Level)
                .Select(m => new
                {
                    m.mt.Id,
                    m.mt.Name,
                    m.mt.Kongfu,
                    m.mt.Level,
                    m.mt.Menpai,
                });

3、武林高手排名

int i = 0;
var sequence2 = from m in master
                from k in Kongfu
                where m.Kongfu == k.KongfuName
                orderby m.Level * k.Lethality descending, m.Age descending, m.Name
                select new
                {
                    m.Name,
                    m.Id,
                    m.Kongfu,
                    weili = m.Level * k.Lethality,
                    paiming = ++i
                };
var sequence2Method = master.SelectMany(m => Kongfu, (m, k) => new { mt = m, kf = k }).Where(m => m.mt.Kongfu == m.kf.KongfuName).OrderByDescending(x => x.kf.Lethality * x.mt.Level).ThenByDescending(x => x.mt.Age).Select(
                x => new { 
                    x.mt.Id,
                    x.mt.Name,
                    V = x.mt.Level *x.kf.Lethality,
                    x.mt.Kongfu,
                    paimign = ++i
                });

4、武林高手排名(多次分类排名)

var sequenceM = from m in master
                where m.Level > 8
                orderby m.Level descending
                select m;
var sequenceK = from k in Kongfu
                where k.Lethality > 90
               orderby k.Lethality descending
               select k;

var sequence3 = from m in sequenceM
                from k in sequenceK 
                where m.Kongfu == k.KongfuName
                //join k in Kongfu on m.Kongfu equals k.KongfuName //这种join为左连接方式
                orderby m.Level * k.Lethality descending
               select new
                    {
                        paiming = ++i,
                        m.Id,
                        m.Name,
                        m.Age,
                        V = m.Level * k.Lethality
                    };

5、对功夫进行分组

var sequence4 = from k in Kongfu
                join m in master on k.KongfuName equals m.Kongfu 
                into groups
                orderby groups.Count() descending
                select new
                {
                    V = ++i,
                    k.KongfuId,
                    k.KongfuName,
                   V1 = groups.Count()
                };

6、华山与明教都使用葵花宝典的大侠

//Intersect:相等比较器,生成两个序列的交集
            var sequence5 = (from m in master
                             where m.Menpai == "明教" || m.Menpai == "华山"
                             select m).Intersect(from m in master where m.Kongfu == "葵花宝典"                                 select m);