LinQ to SQL
LinQ - 集成化查询语言。
LINQ 语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展。
它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。
LinQ to SQL ——查询SQLServer数据库
LinQ to Object —— 查询内存中的集合
ORM思想:O - R - M
Object 对象——实体类
Relation 关系数据库——数据库中的表
Mapping 映射——把类和表;字段和列 对应。
LinQ生成实体类的结构:
1.生成一个DataContext类。相当于程序内存和硬盘数据库之间的桥梁。
2.生成一系列的实例类,与表是一一对应的。
3.每个实体类中都有与表中列相应的属性(值类型的属性都是可以为空的类型bool? int? double?)
int? a=null;//可以为空的类型
System.Nullable<bool> _Sex;
System.Nullable<System.DateTime> _Birthday;
4.数据库中表和表之间的关联关系,被转化成内存中类中的成员变量。
一、增
1.造对象
2.跟context说一声
3.context提交
例:
//创建内存对象与数据库之间的桥梁
MyDBDataContext context = new MyDBDataContext();
//第一步:造实体对象
Info data = new Info();
data.Code = "p101";
data.Name = "张飞";
data.Sex = true;
data.Nation = "n001";
data.Birthday = new DateTime(1990, 3, 15);
//第二步:跟Context说一下,提交的时候对它执行插入操作
context.Info.InsertOnSubmit(data);
//第三步:提交
context.SubmitChanges();
二、删
1.从数据库中找出来
2.跟context说一下,提交的时候,删除
3.提交
//创建内存对象与数据库之间的桥梁
MyDBDataContext context = new MyDBDataContext();
//第一步:找出要删除的对象。
//var query = from p in context.Info where p.Code == "p101" select p;
var query = context.Info.Where(p => p.Code == "p101");
Info data = query.First();
//第二步:跟Context说一下,提交的时候把这个对象给删掉。
context.Info.DeleteOnSubmit(data);
//第三步:提交
context.SubmitChanges();
三、改
1.从数据库中找出对象来
2.把对象的值改一下。
3.提交送回去。
//创建内存对象与数据库之间的桥梁
MyDBDataContext context = new MyDBDataContext();
//第一步:从数据库找出对象来
var query = context.Info.Where(p=>p.Code == "p009");
Info data = query.First();
//第二步:改
data.Name = "田七";
data.Sex = false;
//第三步:提交
context.SubmitChanges();
四、查
LINQ语句写法 扩展方法
没有条件 查询所有 var query = from p in context.Info select p;
有条件
单
等 值 var query = from p in context.Info where p.Nation == "n001" select p;
不等值 var query = from p in context.Info where p.Birthday < new DateTime(1990, 01, 01) select p;
多
与 或 var query = from p in context.Info where p.Nation == "n001" && p.Sex==true select p;
模糊
以..开头
StartsWiths var query = from p in context.Work where p.Firm.StartsWith("中国") select p;
以..结尾
EndsWiths var query = from p in context.Work where p.Firm.EndsWith("行") select p;
包含..
Contains() var query = from p in context.Work where p.Firm.Contains("内蒙") select p;
指定位置是...
Substring(...) == "值" var query = from p in context.Work where p.Firm.Substring(1, 1) == "国" select p;
var query = from p in context.Work where p.Firm.StartsWith("中国") && p.Firm.EndsWith("行") select p;
链接查询和子查询有语法,但很少写。
直接可使用对象之间的关系对象进行操作,Linq会自动为我们生成出相应的连接语句或子查询语句。
var query=from p in context.Info where p.Nation1.Name=="汉族" select p;
排序:
orderby 属性名 升序 var query = from p in context.Work orderby p.StartDate select p;
orderby 属性名 descending 降序 var query = from p in context.Work orderby p.StartDate descending select p;
扩展方法:
OrderBy()
OrderByDescending()
统计函数。
把LinQ语句括起来,调用相应的方法即可
Count() var query = (from p in context.Info select p).Count();
Sum(p=>p.属性名)
Average(p=>p.属性名)
Max(p=>p.属性名)
Min(p=>p.属性名)
取集合第一个对象。
First() query.first();
分页查询:
skip(要跳过的条数).take(要取出来的条件) var query = (from p in context.Work select p).Skip(6).Take(3);
语句还可以这么写:
var query = context.Info.Where(p => p.Nation1.Name == "汉族").Where(p => p.Sex == false);
var query = context.Info.Where(p => p.Nation1.Name == "汉族" && p.Sex == false);
var query = context.Info.OrderBy(p=>p.Birthday);
var query = context.Info.OrderByDescending(p => p.Birthday);
var query = context.Info.Max(p => p.Birthday);
集合操作:交、并、差
var q1 = context.Info.Where(p => p.Nation != "n001");
var q2 = context.Info.Where(p => p.Sex == true);
交集:var query = q1.Intersect(q2);
并集:var query = q1.Union(q2);
差集:var query = q1.Except(q2);
练习:
public partial class Default4 : System.Web.UI.Page { private const int PageSize = 3;//定义一个常量,每页显示的数量 private MYDBDataContext _context = new MYDBDataContext(); //填充分页的下拉列表下拉列表 private void FillPage() { //获取总页数 int RowsCount = _context.Car.Count();//综行数 int PageCount = Convert.ToInt32(Math.Ceiling(1.0*RowsCount/PageSize)); //填充下拉列表 for (int i = 0; i < PageCount; i++) { ListItem li = new ListItem((i + 1).ToString(), i.ToString()); ddlPage.Items.Add(li); } } //显示指定页的汽车数据 private void ShowCar() { var query = _context.Car.Skip(PageSize * Convert.ToInt32(ddlPage.SelectedValue)).Take(PageSize); Repeater1.DataSource = query; Repeater1.DataBind(); //显示的页数 lblall.Text = ddlPage.Items.Count.ToString(); lbl.Text = ddlPage.SelectedItem.Text; } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { FillPage(); ShowCar(); } } //下拉列表 protected void ddlPage_SelectedIndexChanged(object sender, EventArgs e) { ShowCar(); } //首页 protected void btnfirst_Click(object sender, EventArgs e) { ddlPage.SelectedIndex = 0; ShowCar(); } //尾页 protected void btnend_Click(object sender, EventArgs e) { //ddlPage.SelectedIndex = Convert.ToInt32(1.0 * _context.Car.Count() / PageSize) - 1; ddlPage.SelectedIndex = ddlPage.Items.Count - 1; ShowCar(); } //上一页 protected void btnprev_Click(object sender, EventArgs e) { if (ddlPage.SelectedIndex<=0) { ShowCar(); btnprev.Enabled = false; } if (ddlPage.SelectedIndex>0) { ddlPage.SelectedIndex--; ShowCar(); btnprev.Enabled = true; } } //下一页 protected void btnnext_Click(object sender, EventArgs e) { if (ddlPage.SelectedIndex<ddlPage.Items.Count-1) { ddlPage.SelectedIndex++; ShowCar(); } } }
1.造一个界面:
<head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <style type="text/css"> #tbinfo { background-color:navy; } .ithead { color:white; font-weight:bold; text-align:center; font-family:微软雅黑; } .ititem { background-color:#ffd800; } </style> </head> <body> <form id="form1" runat="server"> <div> <asp:Repeater ID="Repeater1" runat="server"> <HeaderTemplate> <table width="100%" border="0" cellpadding="5" cellspacing="1" id="tbinfo"> <tr class="ithead"> <td width="5%">代号</td> <td width="10%">姓名</td> <td width="5%">性别</td> <td width="5%">民族</td> <td width="15%">生日</td> <td width="25%">单位</td> <td width="10%">部门</td> <td width="10%">父亲</td> <td width="10%">母亲</td> <td width="5%">配偶</td> </tr> </HeaderTemplate> <ItemTemplate> <tr class="ititem"> <td><%# Eval("Code") %></td> <td><%# Eval("Name") %></td> <td><%# Eval("Sexname") %></td> <td><%# Eval("Nationname") %></td> <td><%# Eval("Birthday","{0:yyyy年MM月dd日}") %></td> <td><%# Eval("firm") %></td> <td><%# Eval("depart") %></td> <td><%# Eval("father") %></td> <td><%# Eval("mother") %></td> <td><%# Eval("couple") %></td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> </div> <asp:Button ID="Button1" runat="server" Text="Button" /> </form> </body>
2.造一个info类(部分):方便直接调用属性
public partial class Info { public string Sexname { get { return Sex.Value == true ? "男" : "女"; } } public string Nationname { get { return Nation1.Name; } } public string firm { get { if (this.Work.Count>0) { Work data= Work.OrderByDescending(p => p.Orders).First(); return data.Firm; } else { return "无"; } } } public string depart { get { if (this.Work.Count>0) { Work data = this.Work.OrderByDescending(p => p.Orders).First(); return data.Depart; } else { return "无"; } } } public string father { get { if (this.Family.Count > 0)//家庭关系存在 { var query = this.Family.Where(p => p.Title == "T001"); if (query.Count() > 0)//有父亲这项填了 { return query.First().Name; } else { return "空"; } } else { return "无"; } } } public string mother { get { if (this.Family.Count>0) { var query = this.Family.Where(p=>p.Title=="T002"); if (query.Count()>0) { return query.First().Name; } else { return "空"; } } else { return "无"; } } } public string couple { get { if (this.Family.Count>0) { var query = this.Family.Where(p=>p.Title=="T003"); if (query.Count()>0) { return query.First().Name; } else { return "空"; } } else { return "无"; } } } }
3.主页:绑定数据
private MYDBDataContext _Context = new MYDBDataContext(); private void ShowInfo() { Repeater1.DataSource = _Context.Info; Repeater1.DataBind(); } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ShowInfo(); } }