Linq在查询时非常方便,下面分享一下我在项目开发常用的几个关键字。为了演示,新建了3个类(Student,Course,Score),分别是学生信息表,课程信息表,成绩信息表。
/// <summary>
/// 学生信息表
/// </summary>
class Student
{
public int stuId { get; set; }//学生主键
public string stuNumber { get; set; }//学号
public string stuName { get; set; }//姓名
public int stuAge { get; set; }//年龄
}
/// <summary>
/// 课程信息表
/// </summary>
class Course
{
public int couId { get; set; }//课程主键
public string couName { get; set; }//课程名称
}
/// <summary>
/// 成绩信息表
/// </summary>
class Score
{
public int scoId { get; set; }//成绩主键
public int stuId { get; set; }//学生主键
public int couId { get; set; }//课程主键
public int scoMark { get; set; }//分数
}
Linq常用语法:
static void Main(string[] args)
{
#region
IList<Student> studentList = new List<Student>() {
new Student() { stuId=1, stuNumber="201420214601", stuName="张三", stuAge=19 },
new Student(){ stuId=2, stuNumber="201420214602", stuName="李四", stuAge=20 },
new Student() { stuId=3, stuNumber="201420214603", stuName="王五", stuAge=19 }
};
IList<Course> courseList = new List<Course>() {
new Course() { couId=1, couName="数学" }
};
IList<Score> scoreList = new List<Score>() {
new Score() { scoId=1, stuId=1, couId=1, scoMark=55 },
new Score() { scoId=2, stuId=2, couId=1, scoMark=77},
};
#endregion
#region where ,select
var query1 = from stu in studentList
where stu.stuAge == 19
select new //返回匿名对象
{
stuNumber = stu.stuNumber,
stuName = stu.stuName
};
Console.WriteLine("---------------------------------query1------------------------------");
foreach (var q in query1)
{
Console.WriteLine(string.Format("学号:{0},姓名:{1}", q.stuNumber, q.stuName));
}
#endregion
#region join
var query2 = from sco in scoreList
join stu in studentList
on sco.stuId equals stu.stuId
join cou in courseList
on sco.couId equals cou.couId
select new
{
stu.stuName,
cou.couName,
sco.scoMark
};
Console.WriteLine("---------------------------------query2------------------------------");
foreach (var q in query2)
{
Console.WriteLine(string.Format("姓名:{0},课程:{1},分数:{2}", q.stuName, q.couName, q.scoMark));
}
#endregion
#region case
var query3 = from sco in scoreList
join stu in studentList
on sco.stuId equals stu.stuId
join cou in courseList
on sco.couId equals cou.couId
select new
{
stu.stuName,
cou.couName,
scoMark = sco.scoMark >= 60 ? "及格" : "不及格"
};
Console.WriteLine("---------------------------------query3------------------------------");
foreach (var q in query3)
{
Console.WriteLine(string.Format("姓名:{0},课程:{1},分数:{2}", q.stuName, q.couName, q.scoMark));
}
#endregion
#region left join
var query4 = from stu in studentList
join sco in scoreList
on stu.stuId equals sco.stuId into temp
from tt in temp.DefaultIfEmpty()
select new
{
stu.stuName,
scoMark = tt == null ? "无" : tt.scoMark.ToString()
};
Console.WriteLine("---------------------------------query4------------------------------");
foreach (var q in query4)
{
Console.WriteLine(string.Format("姓名:{0},分数:{1}", q.stuName, q.scoMark));
}
#endregion
#region let
var query5 = from sco in scoreList
join stu in studentList
on sco.stuId equals stu.stuId
join cou in courseList
on sco.couId equals cou.couId
let passMark = "[" + sco.scoMark + "]" + (sco.scoMark >= 60 ? "及格" : "不及格")
select new
{
stu.stuName,
cou.couName,
passMark
};
Console.WriteLine("---------------------------------query5------------------------------");
foreach (var q in query5)
{
Console.WriteLine(string.Format("姓名:{0},课程:{1},分数:{2}", q.stuName, q.couName, q.passMark));
}
#endregion
#region order by
var query6 = from stu in studentList
//orderby stu.stuAge ascending //升序
orderby stu.stuAge descending //降序
select new //返回匿名对象
{
stu.stuNumber,
stu.stuName,
stu.stuAge
};
Console.WriteLine("---------------------------------query6------------------------------");
foreach (var q in query6)
{
Console.WriteLine(string.Format("学号:{0},姓名:{1},年龄:{2}", q.stuNumber, q.stuName, q.stuAge));
}
#endregion
#region distinct
var query7 = (from stu in studentList
orderby stu.stuAge descending
select new //返回匿名对象
{
stu.stuAge
}).Distinct();
Console.WriteLine("---------------------------------query7------------------------------");
foreach (var q in query7)
{
Console.WriteLine(string.Format("年龄分布:{0}", q.stuAge));
}
#endregion
#region top 1
var query8 = (from stu in studentList
where stu.stuAge == 19
select new //返回匿名对象
{
stu.stuNumber,
stu.stuName,
stu.stuAge
}).FirstOrDefault();
Console.WriteLine("---------------------------------query8------------------------------");
if (query8 != null)
{
Console.WriteLine(string.Format("学号:{0},姓名:{1},年龄:{2}",
query8.stuNumber, query8.stuName, query8.stuAge));
}
#endregion
Console.ReadKey();
}
输出结果: