一、如何新建LINQ to SQL项目。
新建项目后,选择新建项,找LINQ toSQL类,然后命名,添加。
找到相应的数据库,选择对应的表,将其托到空白处。
例如:查询WarehouseInfo表的数据。
代码如下:
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext DC = new DataClassesDataContext();//创建数据上下文类的实例
var query = from item in DC.WarehouseInfo
where item.Area >= 100//使用LINQ查询面积大于100平的仓库
orderby item.ShortName//按仓库名称排序
select item;
dataGridView1.DataSource = query.ToList();//将查询结果集绑定到dataGridView1
}
二、使用Contains获取与Not Exist(NOT IN)等价的语句
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
//列出库存中从来没有销售过的商品
var query = from sto in dc.V_StoreInfo
//where子句中应用了子查询
where !(from sal in dc.V_SaleInfo
select sal.ProductCode).Contains(sto.ProductCode)
select new
{
仓库 = sto.WareHouseName,
商品名称 = sto.ProductName,
数量 = sto.Quantity,
单价 = sto.Price,
金额 = sto.Amount
};
dataGridView1.DataSource = query;//将查询结果绑定到dataGridView1
}
三、按多个字段降序排序
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc =new DataClassesDataContext();//创建数据上下文类的实例
//按商品分类、计量单位降序排序
var query = from item in dc.ProductInfo
orderby item.ProductType descending, item.Unit descending
select item;
dataGridView1.DataSource = query;//将查询结果集绑定到dataGridView1
}
四、关联查询多张表
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建LINQ对象
var query = from sc in dc.SaleContent//销售主表
join sd in dc.SaleDetail on sc.SaleBillCode equals sd.SaleBillCode//按销售单据号关联销售主从表
join pi in dc.ProductInfo on sd.ProductCode equals pi.ProductCode//按商品代码关联商品信息表
join ei in dc.EmployeeInfo on sc.SaleMan equals ei.EmployeeCode//按人员代码关联员工表
join wi in dc.WarehouseInfo on sc.WareHouse equals wi.WareHouseCode//按仓库代码关联仓库信息表
join ci in dc.ClientInfo on sc.ClientCode equals ci.ClientCode//按客户代码关联客户信息表
select new
{
ID = sc.ID,
SaleBillCode = sc.SaleBillCode,//销售单据号
SaleMan = ei.Name,//从员工表取销售员名称
SaleDate = sc.SaleDate,//销售日期
Provider = ci.ShortName,//从客户表取购买单位名称
WareHouse = wi.ShortName,//从仓库表取仓库名称
ProductCode = pi.ProductCode,//从商品信息表取商品代码
ProductName = pi.ShortName,//商品名称
Quantity = sd.Quantity,//数量
Price = sd.Price,//单价
Amount = sd.Quantity * sd.Price,//金额
GrossProfit = sd.Quantity * (sd.Price - sd.Cost)//毛利=销售金额-商品成本
};
dataGridView1.DataSource = query;//将查询的结果集绑定到dataGridView1
}
五、按照多个条件分组
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
var query = from sto in dc.V_StoreInfo//查询库存表
group sto by new { sto.WarehouseCode, sto.ProductCode } into g//按仓库代码、商品代码分组
select new
{
仓库代码 = g.Key.WarehouseCode,
仓库名称 = g.Max(itm => itm.WareHouseName),
商品代码 = g.Key.ProductCode,
商品名称 = g.Max(itm => itm.ProductName),
库存数量 = g.Sum(itm => itm.Quantity)
};
dataGridView1.DataSource = query;//将分组的结果集绑定到dataGridView1
}
六、Count操作-统计每种商品的销售次数
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
//统计每种商品的销售次数
var query = from det in dc.V_SaleDetail
group det by det.ProductCode into g//按商品代码分组
select new
{
商品代码 = g.Key,
商品名称 = g.Max(itm => itm.ProductName),
销售次数 = g.Count()//使用Count方法统计销售次数
};
dataGridView1.DataSource = query;//将查询结果集绑定到dataGridView1
}
七、SUM操作-统计每种商品的销售总额
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
//统计每种商品的销售总额
var query = from det in dc.V_SaleDetail
group det by det.ProductCode into g//按商品代码分组
select new
{
商品代码 = g.Key,
商品名称 = g.Max(itm => itm.ProductName),
销售总额 = g.Sum(itm => itm.amount)//合计每种商品的销售总额
};
dataGridView1.DataSource = query;//将查询结果绑定到dataGridView1
}
八、MAX操作-统计每种商品的最高销售价
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
//统计每种商品的最高销售价
var query = from det in dc.V_SaleDetail
group det by det.ProductCode into g//按商品代码分组
select new
{
商品代码 = g.Key,
商品名称 = g.Max(itm => itm.ProductName),
最高销售价 = g.Max(itm => itm.Price)//统计每种商品的最高销售价
};
dataGridView1.DataSource = query;//对dataGridView1进行数据绑定
}
九、Min操作-统计每种商品的最低售价
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
//统计每种商品的最低销售单价
var query = from det in dc.V_SaleDetail
group det by det.ProductCode into g//按商品代码分组
select new
{
商品代码 = g.Key,
商品名称 = g.Max(itm => itm.ProductName),
销售最低价 = g.Min(itm => itm.Price)//统计每种商品的最低销售单价
};
dataGridView1.DataSource = query;//对dataGridView1进行数据绑定
}
十、Average操作-统计每种商品的销售均价
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
//统计每种商品的销售平均价
var query = from det in dc.V_SaleDetail
group det by det.ProductCode into g//按商品代码分组
select new
{
商品代码 = g.Key,
商品名称 = g.Max(itm => itm.ProductName),
销售平均价 = g.Average(itm => itm.Price)//使用Average统计每种商品的销售平均价
};
dataGridView1.DataSource = query;//将查询的结果集绑定到dataGridView1
}
十一、差集操作-获取从未返过货的商品列表
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
var saleInfo = dc.V_SaleInfo.Select(itm => new { itm.ProductCode, itm.ProductName });//销售信息
var saleRetu = dc.V_SaleReturnInfo.Select(itm => new { itm.ProductCode, itm.ProductName });//销售返货
var query = saleInfo.Except(saleRetu);//取差集
dataGridView1.DataSource = query;//将查询的结果集绑定到dataGridView1
}
十二、直接执行SQL语句
private void button1_Click(object sender, EventArgs e)
{
string sql = "select * from V_StoreInfo where 1=1";
if (comboBox1.SelectedIndex > -1)//仓库下拉列表不为空
{
sql += " and WareHouseName = '" + comboBox1.Text + "'";
}
if (textBox1.Text.Trim()!= "")//商品助记码文本框不为空
{
sql += " and HelpCode like '" + textBox1.Text + "%'";
}
var query = dc.ExecuteQuery<V_StoreInfo>(sql);//执行SQL查询
dataGridView1.DataSource = query.ToList();//对dataGridView1进行数据绑定
}
十三、使用LINQ技术向SQL数据库中添加数据
private void button1_Click(object sender, EventArgs e)
{
//判断是否输入姓名、年龄、电话和家庭住址
if (txtaddress.Text != "" && txtage.Text != "" && txtName.Text != "" && txtphone.Text != "")
{
if (txtphone.Text.Length != 11)//判断输入的电话号码是否合法
{
MessageBox.Show("电话号码位数不正确");//不合法则弹出提示
}
else//如果输入的电话号码合法
{
linq = new linqtosqlDataContext();//创建linq连接对象
tb_User users = new tb_User();//创建tb_User对象
users.User_Name = txtName.Text.Trim();//设置姓名
users.User_Sex = cbbSex.Text;//性别
users.User_Age = txtage.Text;//年龄
users.User_Marriage = cbbmary.Text;//婚姻状况
users.User_Duty = cbbduty.Text;//职位
users.User_Phone = txtphone.Text;//电话
users.User_Address = txtaddress.Text;//家庭住址
linq.tb_User.InsertOnSubmit(users);//提交数据
linq.SubmitChanges();//执行对数据库的修改
binginfo();//重新绑定数据
MessageBox.Show("添加成功");//弹出提示
}
}
}
十四、使用LINQ技术在SQL数据库中修改数据
int Pid;//定义一个变量,用来记录选中的编号
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.SelectedRows.Count != 0)//判断是否选中行
{
linq = new linqtosqlDataContext(strCon);//初始化LINQ连接对象
Pid = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells[0].Value);//记录选中的编号
//查询符合指定条件的信息
var result = from info in linq.tb_User
where info.ID == Pid
select new
{
Name = info.User_Name,//获取姓名
Sex = info.User_Sex,//获取性别
Age = info.User_Age,//获取年龄
Mary = info.User_Marriage,//获取婚姻状况
Duty = info.User_Duty,//获取职位
Phone = info.User_Phone,//获取联系电话
Address = info.User_Address//获取联系地址
};
foreach (var item in result)
{
txtName.Text = item.Name.Trim();//显示姓名
cbbSex.Text = item.Sex.Trim();//显示性别
txtage.Text = item.Age.Trim();//显示年龄
cbbmary.Text = item.Mary.Trim();//显示婚姻状况
cbbduty.Text = item.Duty.Trim();//显示职位
txtphone.Text = item.Phone.Trim();//显示联系电话
txtaddress.Text = item.Address.Trim();//显示联系地址
}
}
}
private void button1_Click(object sender, EventArgs e)
{
//判断是否输入姓名、年龄、电话和家庭住址
if (txtaddress.Text != "" && txtage.Text != "" && txtName.Text != "" && txtphone.Text != "")
{
if (txtphone.Text.Length != 11)//如果电话号码错误
{
MessageBox.Show("电话号码位数不正确");//弹出提示
}
else
{
linq = new linqtosqlDataContext(strCon);
var resultChange = from info in linq.tb_User
where info.ID == Pid//创建linq,设置其根据ID值进行修改
select info;
foreach (tb_User users in resultChange)
{
users.User_Name = txtName.Text;//姓名
users.User_Sex = cbbSex.Text;//性别
users.User_Age = txtage.Text;//年龄
users.User_Marriage = cbbmary.Text;//婚姻状况
users.User_Duty = cbbduty.Text;//职位
users.User_Phone = txtphone.Text;//电话
users.User_Address = txtaddress.Text;//家庭地址
linq.SubmitChanges();//SubmitChanges方法提交修改
}
MessageBox.Show("修改成功");//弹出成功的提示
binginfo();//重新绑定数据
}
}
}
十五、使用LINQ技术在SQL数据库中删除数据
int id;//定义一个变量,用来记录选中的编号
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.SelectedRows.Count != 0)//判断是否选中行
{
id =Convert.ToInt32( dataGridView1.SelectedRows[0].Cells[0].Value);//记录用户选择的编号
}
}
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void button1_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count != 0)//判断是否选择了项目
{
linq = new linqtosqlDataContext(strCon);
var result = from info in linq.tb_User
where info.ID == id
select info;//创建linq,并设置删除的条件
linq.tb_User.DeleteAllOnSubmit(result);//通过DeleteAllOnSubmit方法删除指定的数据
linq.SubmitChanges();//提交对数据表的修改
MessageBox.Show("删除成功");//弹出提示
bindinfo();//重新绑定数据
}
else//如果没有选择项
{
MessageBox.Show("请选择删除项");//显示提示信息
}
}
十六、使用存储过程查询表单数据
将存储过程拖进 .dbml文件中,然后调用如下代码:
private void button1_Click(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
var query = dc.P_queryWarehouseInfo(textBox1.Text);//调用存储过程返回仓库信息
dataGridView1.DataSource = query;//将查询结果绑定到dataGridView1
}
十七、使用LINQ技术调用SQL中的方法
ALTER FUNCTION [dbo].[F_GetSex]
(
@SexFlag Varchar(10)
)
RETURNS Varchar(2)
AS
begin
declare @sex varchar(2)
IF (@SexFlag = 1)
set @sex = '女'
ELSE
set @sex = '男'
RETURN @sex
end
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
var query = from emp in dc.EmployeeInfo
select new
{
emp.Addr,
emp.Birthday,
emp.EMail,
emp.EmployeeCode,
emp.Handset,
emp.HelpCode,
emp.ID,
emp.IDCard,
emp.Name,
emp.OperateDate,
emp.Operator,
emp.Tel,
Sex = dc.F_GetSex(emp.Sex)//调用SQL Server中的函数显示中文的性别信息
};
dataGridView1.DataSource = query.Take(5);//将查询结果集绑定到dataGridView1
}
十八、根据外键获取主键信息
private void Frm_Main_Load(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();//创建数据上下文类的实例
var query = from it in dc.DictionaryItem
select new
{
it.DictItemID,
it.DictionaryType.DictTypeCode,//通过EntityRef<T>类型获取主表信息
it.DictionaryType.DictTypeName,
it.DictItemCode,
it.DictItemName
};
dataGridView1.DataSource = query;//将查询的结果集绑定到dataGridView1
}