浅话LINQ
Language Integrated Query(LINQ) 是C#3.0 和.NET3.5中最重要的功能,LINQ集成了C#编程语言中的查询语法,可以用相同的语法访问不同的数据源。
一、LINQ的语法规则
LINQ查询表达式必须以from子句开头,以select或group字句结束。在这两个字句之间,可以使用where,orderby,join,let和其他的from字句
二、LINQ的特性
1)推迟查询的执行
Eg:
class Program
{
static void Main(string[] args)
{
List<string> names = new List<string> { "Ni", "dsad", "Jsdsds", "fsd" };
var nameWithJ = from n in names where n.StartsWith("J") orderby n select n;
Console.WriteLine("First iteration");
foreach (string name in nameWithJ)
{
Console.WriteLine(name);
}
Console.WriteLine();
names.Add("Jddd");
names.Add("Jdsadsa");
names.Add("Jlldd");
Console.WriteLine("Second iteration");
foreach (string name in nameWithJ)
{
Console.WriteLine(name);
}
}
}
结果:
First iteration
Jsdsds
Second iteration
Jddd
Jdsadsa
Jlldd
Jsdsds
2)过滤
Eg:
List<Racer> racer = new List<Racer>();
var racers = from r in racer where r.Wins > 13 && r.Country == "China" orderby r.Wins ascending select r;
foreach (var r in racers)
{
Console.WriteLine(r);
}
//racer里面的Wins 、Country字段我都没有加,上面的LINQ语句也可以用入表达式写为:var racers=racer.Where(r=>r.Wins>12&&r.Country==”China”).Select(r=>r)
3)用索引来过滤
并不是所有查询都可以用LINQ语句实现的,譬如Where()方法的重载,在Where()方法中可以传入第二个参数------索引
var racers = racer .Where((r, index) => r.FirstName.StartsWith("d") && index % 2 != 0).Select(r => r);
//FirstName的开头字母为d,并且索引值%2!=0的racer
foreach (var r in racers)
{
Console.WriteLine(r);
}
4)类型过滤
object[] data = { "one", 2, 3, "four", "five", 6 };
var query = data.OfType<string>();
foreach (var s in query)
{
Console.WriteLine(s);
}
结果:
one
four
five
5)复合的from子句/排序
eg:
#region 复合的from子句
//var f = from r in racerwhere r.Cars == "aaa" orderby r.LastName select r.FirstName + " " + r.LastName;
//var f = from r in racer
// from c in r.Cars
// where c == "aaa"
// orderby r.LastName
// select r.FirstName + " " + r.LastName;
#endregion
//#region 排序
//var f = from r in racer where r.Coutry == "China" orderby r.Wins descending select r;
//var f = racer .Where(r => r.Coutry == "China").OrderByDescending(r => r.Wins).Select(r => r);
//#endregion
var f = (from r in racer where r.Coutry == "China" orderby r.Wins descending select r).Take(3);//提取前三个结果
foreach (var r in f)
{
Console.WriteLine(r);
}
6)分组
// var list = from r in racer
// group r by r.Country into g
// orderby g.Count() descending,g.Key //根据Count排序,当Count相同的时候根据Key排序
// where g.Count() >= 2
// select g.Key+" "+g.Count();
用入表示式:
// var list = racer .
// GroupBy(r => r.Country).
// OrderByDescending(g => g.Count()).
// ThenBy(g => g.Key).
// Where(g => g.Count() >= 2).
// Select(g => g.Key + " " + g.Count());
//foreach (var r in list)
//{
// Console.WriteLine(r);
//}
//对嵌套的对象分组
var list = from r in racer
group r by r.Country into g
orderby g.Count() descending, g.Key
where g.Count() >= 2
select new
{
Country = g.Key,
Count = g.Count(),
Racers = from r1 in g orderby r1.Name select r1.Name
};
foreach (var item in list)
{
Console.WriteLine(item.Country+"\t"+item.Count);
foreach (var name in item.Racers)
{
Console.Write(name+"\t");
}
Console.WriteLine();
}
7)连接
var racers = from r in racer where r.Years > 2003
select new
{
Year = r.Years,
Country = r.Country
};
var teams = from t in racer where t.Years > 2003
select new
{
Year = t.Years,
Name = t.Name
};
var racersAndTeams = from r in racers join t in teams on r.Year equals t.Year
select new
{
Year = r.Year,
Country = r.Country,
Name = t.Name
};
foreach (var item in racersAndTeams)
{
Console.WriteLine(item.Year + "\t" + item.Country + "\t" + item.Name);
}
8)分区
Eg:
int pageSize=5; //每一页显示的数目
int numberPages=(int)Math.Ceiling(racer.count())/(double)pageSize; //页数
for(int page=0;page<numberPage;page++)
{
Console.WriteLine("page {0}",page);
var racers=(from r in racer orderby r.LastName select r.FirstName+""+r.LastName)
.Skip(page*pageSize).Take(pageSize); //Skip表示跳过当前页之前的数据,Take表示取出当前页的数据
foreach(var name in racers)
{
Console.WriteLine(name);
}
}
9)合计操作符
合计操作符Count() Sum() Min() Max() Average()不是返回一个序列,而是返回一个值
Eg:
var query=from r in racer where r.Year.Count()>3
select new
{
TimeChampions=r.Year.Count();
};
Foreach(var r in query)
{
Console.WriteLine(r.TimeChampions);
}
Sun方法汇总序列中的所有数字,并返回这些数字的和
…….
10)转换
调用Tolist()方法,立即执行查询,把结果放在List<T>里面
List<Racer> racers=(from r in racer where r.Wins>12 select r).ToList();
foreach(var racer in racers)
{
Console.WriteLine(racer);
}
一、LINQ的语法规则
LINQ查询表达式必须以from子句开头,以select或group字句结束。在这两个字句之间,可以使用where,orderby,join,let和其他的from字句
二、LINQ的特性
1)推迟查询的执行
Eg:
class Program
{
static void Main(string[] args)
{
List<string> names = new List<string> { "Ni", "dsad", "Jsdsds", "fsd" };
var nameWithJ = from n in names where n.StartsWith("J") orderby n select n;
Console.WriteLine("First iteration");
foreach (string name in nameWithJ)
{
Console.WriteLine(name);
}
Console.WriteLine();
names.Add("Jddd");
names.Add("Jdsadsa");
names.Add("Jlldd");
Console.WriteLine("Second iteration");
foreach (string name in nameWithJ)
{
Console.WriteLine(name);
}
}
}
结果:
First iteration
Jsdsds
Second iteration
Jddd
Jdsadsa
Jlldd
Jsdsds
2)过滤
Eg:
List<Racer> racer = new List<Racer>();
var racers = from r in racer where r.Wins > 13 && r.Country == "China" orderby r.Wins ascending select r;
foreach (var r in racers)
{
Console.WriteLine(r);
}
并不是所有查询都可以用LINQ语句实现的,譬如
var racers = racer .Where((r, index) => r.FirstName.StartsWith("d") && index % 2 != 0).Select(r => r);
//FirstName的开头字母为d,并且索引值%2!=0的racer
foreach (var r in racers)
{
Console.WriteLine(r);
}
4)类型过滤
object[] data = { "one", 2, 3, "four", "five", 6 };
var query = data.OfType<string>();
foreach (var s in query)
{
Console.WriteLine(s);
}
结果:
one
four
five
5)复合的from子句/排序
eg:
#region 复合的from子句
//var f = from r in racer
//var f = from r in racer
// from c in r.Cars
// where c == "aaa"
// orderby r.LastName
// select r.FirstName + " " + r.LastName;
#endregion
//var f = from r in racer where r.Coutry == "China" orderby r.Wins descending select r;
//var f = racer .Where(r => r.Coutry == "China").OrderByDescending(r => r.Wins).Select(r => r);
//#endregion
var f = (from r in racer where r.Coutry == "China" orderby r.Wins descending select r).Take(3);//提取前三个结果
foreach (var r in f)
{
Console.WriteLine(r);
}
6)分组
// var list = from r in racer
// group r by r.Country into g
// orderby g.Count() descending,g.Key //根据Count排序,当Count相同的时候根据Key排序
// where g.Count() >= 2
// select g.Key+" "+g.Count();
用入表示式:
// var list = racer .
// GroupBy(r => r.Country).
// OrderByDescending(g => g.Count()).
// ThenBy(g => g.Key).
// Where(g => g.Count() >= 2).
// Select(g => g.Key + " " + g.Count());
//foreach (var r in list)
//{
// Console.WriteLine(r);
//}
//对嵌套的对象分组
var list = from r in racer
group r by r.Country into g
orderby g.Count() descending, g.Key
where g.Count() >= 2
select new
{
Country = g.Key,
Count = g.Count(),
Racers = from r1 in g orderby r1.Name select r1.Name
};
foreach (var item in list)
{
Console.WriteLine(item.Country+"\t"+item.Count);
foreach (var name in item.Racers)
{
Console.Write(name+"\t");
}
Console.WriteLine();
}
7)连接
var racers = from r in racer where r.Years > 2003
select new
{
Year = r.Years,
Country = r.Country
};
var teams = from t in racer where t.Years > 2003
select new
{
Year = t.Years,
Name = t.Name
};
var racersAndTeams = from r in racers join
select new
{
Year = r.Year,
Country = r.Country,
Name = t.Name
};
foreach (var item in racersAndTeams)
{
Console.WriteLine(item.Year + "\t" + item.Country + "\t" + item.Name);
}
8)分区
Eg:
int pageSize=5; //每一页显示的数目
int numberPages=(int)Math.Ceiling(racer.count())/(double)pageSize; //页数
for(int page=0;page<numberPage;page++)
{
Console.WriteLine("page {0}",page);
var racers=(from r in racer orderby r.LastName select r.FirstName+""+r.LastName)
.Skip(page*pageSize).Take(pageSize); //Skip表示跳过当前页之前的数据,Take表示取出当前页的数据
foreach(var name in racers)
{
Console.WriteLine(name);
}
}
9)合计操作符
合计操作符Count() Sum() Min() Max() Average()不是返回一个序列,而是返回一个值
Eg:
var query=from r in racer where r.Year.Count()>3
select new
{
TimeChampions=r.Year.Count();
};
Foreach(var r in query)
{
Console.WriteLine(r.TimeChampions);
}
Sun方法汇总序列中的所有数字,并返回这些数字的和
…….
10)转换
调用Tolist()方法,立即执行查询,把结果放在List<T>里面
List<Racer> racers=(from r in racer where r.Wins>12 select r).ToList();
foreach(var racer in racers)
{
Console.WriteLine(racer);
}