Linq To SQl总结

简介: Linq To SQl总结

一、如何新建LINQ to SQL项目。


  1. 新建项目后,选择新建项,找LINQ toSQL类,然后命名,添加。

tt.png

找到相应的数据库,选择对应的表,将其托到空白处。

tt.pngtt.png

例如:查询WarehouseInfo表的数据。


tt.png

代码如下:


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中的方法

tt.png

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


       }


十八、根据外键获取主键信息

tt.png

tt.png

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


       }




tt.png


目录
相关文章
|
6月前
|
SQL 开发框架 .NET
C# Linq SaveChanges()报错 You have an error in your SQL syntex
C# Linq SaveChanges()报错 You have an error in your SQL syntex
29 0
|
SQL 存储 缓存
老司机总结的12条 SQL 优化方案(非常实用)(一)
老司机总结的12条 SQL 优化方案(非常实用)
老司机总结的12条 SQL 优化方案(非常实用)(一)
|
SQL 开发框架 .NET
SQL中in和not in在LINQ中的写法
SQL中in和not in在LINQ中的写法
|
SQL 开发框架 .NET
ef linq方式插入+sql操作数据注意事项
ef linq方式插入+sql操作数据注意事项
90 0
|
SQL 存储 分布式计算
ODPS SQL优化总结
ODPS(Open Data Processing Service)是一个海量数据处理平台,基于阿里巴巴自主研发的分布式操作系统(飞天)开发,是公司云计算整体解决方案中最核心的主力产品之一。本文结合作者多年的数仓开发经验,结合ODPS平台分享数据仓库中的SQL优化经验。
2907 0
ODPS SQL优化总结
|
SQL 存储 数据库
工作总结之因为笛卡尔积问题写SQL搞了半天[害](附笛卡尔积总结)
在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个表,而如果大多查询只涉及到一个表的,那么那个表也往往低于第三范式,存在大量冗余和异常。
311 0
工作总结之因为笛卡尔积问题写SQL搞了半天[害](附笛卡尔积总结)
|
SQL 存储 数据库
Sql知识总结-库表视图的增删改查
Sql知识总结-库表视图的增删改查
162 0
|
SQL 数据库 数据安全/隐私保护
数据库常用SQL总结
数据库常用SQL总结
293 0
|
SQL 关系型数据库 MySQL
老司机总结的12条 SQL 优化方案(非常实用)(二)
老司机总结的12条 SQL 优化方案(非常实用)(二)
老司机总结的12条 SQL 优化方案(非常实用)(二)
|
SQL 关系型数据库 MySQL
SQL:MySQL7种JOIN用法总结
SQL:MySQL7种JOIN用法总结
265 0
SQL:MySQL7种JOIN用法总结

热门文章

最新文章