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();
}
}