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将更改保存到数据库。