Linq语句使用问题总结
Linq使用in关键字完成多个条件的操作
1 MyDataContext db = new MyDataContext(); 2 3 string[] strArray = new string [] { "ALFKI", "ANATR" }; 4 5 var result = from c in db.Orders 6 where strArray.Contains(c.CustomerID) 7 orderby c.CustomerID ascending 8 select c;
LINQ的IN解析成SQL:
SELECT [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [t0].[RequiredDate], [t0].[ShippedDate], [t0].[ShipVia], [t0].[Freight], [t0].[ShipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion], [t0].[ShipPostalCode], [t0].[ShipCountry]
FROM [dbo].[Orders] AS [t0]
WHERE [t0].[CustomerID] IN (@p0, @p1)
批量更新、删除数据
当程序中发生更新、删除数据操作时,要考虑是否是批量的行为。
如果是批量的操作行为,那么最好使用 update set where id in(ids)
这样多次的数据库请求就变成了一次数据库请求
多表链接
1 var saleOrderSplitDetileDatasLst=(from ts in tempSplitLst 2 join sos in saleOrderSplitDatas on ts.splitOrderID equals sos.splitOrderID into temp1 3 from sos in temp1.DefaultIfEmpty() 4 join psto in produceSaleTaskOrderDatas 5 on new { sos.productMaterialKind, sos.baseproduceProductTypeID } 6 equals new { psto.productMaterialKind, psto.baseProduceProductTypeID } 7 where temp1.taskOrderID > maxTaskOrderId 8 select new { temp1.taskOrderID ,sos}).ToList();
这块有问题:
如果tempSplitLst是数据实体表集合就不会出现:join子句中其中一个表达式的类型不正确;这个错误;但我代码时这块是实体类与数据实体像关联就会出现前边的错误
另外这么写的复杂度比较高,可以将代码改为:
1 var saleOrderSplitDetileDatasLst = from ts in tempSplitLst 2 from sos in saleOrderSplitDatas 3 from psto in produceSaleTaskOrderDatas 4 where ts.splitOrderID == sos.splitOrderID && sos.productMaterialKind == psto.productMaterialKind 5 && psto.periodTypeID == (short?)sos.periodTypeID && psto.baseProduceProductTypeID == sos.baseproduceProductTypeID 6 && psto.taskOrderID > maxTaskOrderId 7 select new { psto.taskOrderID, sos };
这样讲多个关联条件放在where子句中,降低开发难度,可读性也高一些,同时避免了表字段属性不同的这个问题
GroupBy多字段分组并对字段进行操作
1 var saleOrderSplitDatasLst = (from ts in tempSplitLst 2 join sos in saleOrderSplitDatas on ts.splitOrderID equals sos.splitOrderID 3 group sos 4 by new { sos.productMaterialKind, sos.periodTypeID, sos.baseproduceProductTypeID } into j 5 select new { saleMoney = j.Sum(e => e.saleMoney), saleOrderDate = j.Min(e => e.saleOrderDate), j.Key }).ToList();
group时列出要对分组的数据,by new后,可以对分组的字段进行一些汇总,这样在select时可以展示出集合列;对应的sql语句
INSERT INTO produceSaleTaskOrder (saleMoney,orderStatusID,saleOrderDate,boxOrderStatusID,buyStatusID,productMaterialKind,periodTypeID ,orderTypeID,dzType,produceLineID,baseProduceProductTypeID,branchDepID) SELECT SUM(sos.saleMoney),0,MIN(sos.saleOrderDate),0,77,isnull(sos.productMaterialKind,''),sos.periodTypeID ,@ordderTypeID,@dzType,@produceLineID,isnull(sos.baseProduceProductTypeID,0),@branchDepID FROM #tempSplit ts INNER JOIN saleOrderSplit sos ON sos.splitOrderID = ts.splitOrderID GROUP BY isnull(sos.productMaterialKind,''),sos.periodTypeID,isnull(sos.baseProduceProductTypeID,0)
GroupBy使用解析
var GroupData = (from a in data select a).GroupBy(o => new { o.ArrAngeID }); foreach (var item in GroupData) { AirMoneyView model = new AirMoneyView(); model.ArrAngeID = item.Key.ArrAngeID; foreach (var ik in item) { model.GroupID = ik.GroupID; model.GroupNo = ik.GroupNo; model.ArrAngeMoney = ik.ArrAngeMoney; //要求部门名称 model.GroupDeptName = ik.GroupDeptName; model.GroupDeptNo = ik.GroupDeptCode; model.InputDeptName = ik.InputDeptName; model.InputDeptNo = ik.InputDeptCode; } model.ConfirmMoney = item.Sum(o=>o.ConfirmMoney); }

通过需求按照主键循环第一次获得key,第二次循环使用第一次循环后的集合(KEY+后续字段),循环出要使用的id、name等信息
作者:大胖儿在努力
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号