linq案例陈述
我需要一些在LINQ(C#)CASE语句的帮助:
osc_products.products_quantity = CASE WHEN itempromoflag <> 'N' THEN 100000 WHEN itemcat1 IN ('1','2','31') AND itemsalestatus = 'S' THEN 100000 WHEN itemsalestatus = 'O' THEN 0 ELSE cds_oeinvitem.itemqtyonhand - cds_oeinvitem.itemqtycommitted END
我开始转换到LINQ,(我还在学习):
cdsDBDataContext db = new cdsDBDataContext(); var query = from items in db.cdsItems where items.ItemHandHeldFlag.Equals("Y") && items.ItemQtyOnHand - items.ItemQtyCommitted > 0 select items;
此查询将库存状态从生产更新到商业网站。
如果它只是在LINQ中的CASE语句之后(阅读你的评论),那么这个例子就是…
Int32[] numbers = new Int32[] { 1, 2, 1, 3, 1, 5, 3, 1 }; var numberText = ( from n in numbers where n > 0 select new { Number = n, Text = ( n == 1 ? "One" : n == 2 ? "Two" : n == 3 ? "Three" : "Unknown" ) } );
这是我迄今取得的进展,目前还没有工作,但是是一个开始:
var query2 = from items in db.cdsItems where items.ItemTrackingCode.Equals("A") && (items.ItemQtyOnHand - items.ItemQtyCommitted) > 0 select new { items, qty = ( items.ItemPromoFlag.Equals("1") ? "100000" : items.ItemCat1.Equals("1") ? "100000" : items.ItemSaleStatus.Equals("O") ? "0" : (items.ItemQtyOnHand - items.ItemQtyCommitted).ToString ) };
这个语法对我来说似乎太尴尬了……我可能只是传递SQL
首先,select您想要更新的项目。 然后,在普通的C#中更新它们。 提交更改。
var q = from osc in MyDataContext.osc_products join cds in cds_oeinvitem on osc.products_model equals cds.itemno into p where osc.Itemwebflag == 'Y' select p; foreach (var item in q) { if (item.itempromoflag != "N") item.products_quantity = 100000; else if ((new[] { 1, 2, 31 }.Contains(item.itemcat1)) && (item.itemsalestatus == 'S')) item.products_quantity = 100000; else if (item.itemsalestatus == 0) item.products_quantity = 0; else item.products_quantity = item.itemqtyonhand - item.itemqtycommitted; } MyDataContext.SubmitChanges();
在存储过程中使用单个UPDATE语句,将比在应用程序服务器上进行循环更新更好。
您正在执行批量更新,但链接纯粹是查询和对象select工具。 使用适当的工具来完成这个工作,在这种情况下,这绝对是数据库服务器。
在Linq中没有“Update”语句(无论你使用什么味道,无论是LinqToSQL还是LinqToEntities)。
Linq严格提供查询语言。
如果您使用的是LinqToSQL并想要更新数据,则需要先查询需要更新的项目的上下文,然后循环更改其属性,最后调用SubmitChanges将更改保存到数据库。