linq是什么?

linq是language integrated query(语言集成查询的缩写), 对其的描述:

语言集成查询 (linq) 是一系列直接将查询功能集成到 c# 语言的技术统称。

基本用法是什么?

(我目前也只会最基本的用法。。)

linq查询操作由三个不同的操作组成:

  1. 获取数据源
  2. 创建查询
  3. 执行查询

下面我将用我学习时用的一个小例子来演示。

有两个数据源:武林高手的集合和武林绝学的集合。

我用的是两个集合,实际上不只是集合可以作为数据源

微软官方文档提到:

上例中,数据源是一个数组,因此它隐式支持泛型ienumerable<t> 接口。 这一事实意味着该数据源可以用 linq 进行查询。

说回我的例子,我实现了两个类:

matialartsmaster 表示武林高手:

//武林高手
class matialartsmaster
{ 
 public int id { get; set; }
 public string name { get; set; }
 public int age { get; set; }
 public string menpai { get; set; }
 public string kongfu { get; set; }
 public int level { get; set; }
 public override string tostring()
 {
  return string.format("id:{0},name:{1},age:{2},menpai:{3},kongfu:{4},level:{5}", this.id, this.name, this.age, this.menpai, this.kongfu, this.level);
 }
}

kongfu 表示武林绝学:

//武学
class kongfu
{
 public int id { get; set; }
 public string name { get; set; }
 public int power { get; set; }
 public kongfu() { }
 public kongfu(int id, string name, int power)
 {
  id = id;
  name = name;
  power = power;
 }
 public override string tostring()
 {
  return string.format("id:{0},name:{1},power:{2}", this.id, this.name, this.power);
 }
}

然后填充两个集合:

{
   var masterlist = new list<matialartsmaster>
   {
    new matialartsmaster(){id=001,name="黄蓉",age=18,menpai="丐帮",kongfu="打狗棒法",level=9},
    new matialartsmaster(){id=002,name="洪七公",age=70,menpai="丐帮",kongfu="打狗棒法",level=10},
    new matialartsmaster(){id=003,name="郭靖",age=22,menpai="丐帮",kongfu="降龙十八掌",level=10},
    new matialartsmaster(){id=004,name="任我行",age=50,menpai="明教",kongfu="葵花宝典",level=1},
    new matialartsmaster(){id=005,name="东方不败",age=35,menpai="明教",kongfu="葵花宝典",level=10},
    new matialartsmaster(){id=006,name="林平之",age=23,menpai="华山",kongfu="葵花宝典",level=7},
    new matialartsmaster(){id=007,name="岳不群",age=50,menpai="华山",kongfu="岳不群",level=8},
    new matialartsmaster(){id=008,name="令狐冲",age=23,menpai="华山",kongfu="独孤九剑",level=10},
    new matialartsmaster(){id=009,name="梅超风",age=23,menpai="梅花岛",kongfu="九阴真经",level=8},
   };
   var kungfulist = new list<kongfu>()
   {
    new kongfu(){id=1,name="打狗棒法",power=90},
    new kongfu(){id=2,name="降龙十八掌",power=95},
    new kongfu(){id=3,name="葵花宝典",power=100},
    new kongfu(){id=4,name="独孤九剑",power=100},
    new kongfu(){id=5,name="九阴真经",power=100},
   };

接下来就是查询了,基本的linq查询操作主要通过 from , in , select , where 关键字实现。例如:

查询修炼 葵花宝典 的武林高手:

var res = from master in masterlist
     where master.kongfu == "葵花宝典"
     select master;
  foreach(var temp in res)
  {
   console.writeline(temp.tostring());
  }
  //id: 4,name: 任我行,age: 50,menpai: 明教,kongfu: 葵花宝典,level: 1
  //id: 5,name: 东方不败,age: 35,menpai: 明教,kongfu: 葵花宝典,level: 10
  //id: 6,name: 林平之,age: 23,menpai: 华山,kongfu: 葵花宝典,level: 7

查询所有武林高手的名字:

var res = from master in masterlist
     select master.name;
  foreach(var temp in res)
  {
   console.writeline(temp.tostring());
  }
  //黄蓉
  //洪七公
  //郭靖
  //任我行
  //东方不败
  //林平之
  //岳不群
  //令狐冲
  //梅超风

微软官方将 from 关键字后的那个变量称为 范围变量 :

范围变量就像 foreach 循环中的迭代变量,但查询表达式中不会真正发生迭代。 当执行查询时,范围变量将充当对 customers 中每个连续的元素的引用。

这种写法写起来和sql语句十分相似,逻辑功能也基本上一样,所以如果已经会sql的话会很容易理解。

扩展方法

除了这样的标准写法,还可以通过数据源的扩展方法来实现linq查询。最简单易懂的一个方法是 where() 方法。

如要查询所有修炼等级大于8的武林高手:

var res = masterlist.where(master => master.level > 8);
  foreach(var temp in res)
  {
   console.writeline(temp.tostring());
  }
  //id: 1,name: 黄蓉,age: 18,menpai: 丐帮,kongfu: 打狗棒法,level: 9
  //id: 2,name: 洪七公,age: 70,menpai: 丐帮,kongfu: 打狗棒法,level: 10
  //id: 3,name: 郭靖,age: 22,menpai: 丐帮,kongfu: 降龙十八掌,level: 10
  //id: 5,name: 东方不败,age: 35,menpai: 明教,kongfu: 葵花宝典,level: 10
  //id: 8,name: 令狐冲,age: 23,menpai: 华山,kongfu: 独孤九剑,level: 10

扩展方法还有很多,如 select 、 selectmany 、 join 和 orderby 。他们的具体用法可参阅

)。

最后

linq是一项强大的技术,我才了解了一点点linq的知识(甚至可能还有错误,如果有请一定指正!),保持学习才是长久之道。

总结

到此这篇关于c# linq的基本使用方法的文章就介绍到这了,更多相关c# linq基本用法内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!