将 SQL CASE 语句转换为 LINQ:实用指南
本文解决了将 SQL CASE 语句转换为其 LINQ 等效语句的挑战。 用户寻求帮助来翻译以下 SQL 片段:
<code class="language-sql">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 </code>
提供的初始 LINQ 尝试不足:
<code class="language-csharp">cdsDBDataContext db = new cdsDBDataContext(); var query = from items in db.cdsItems where items.ItemHandHeldFlag.Equals("Y") && items.ItemQtyOnHand - items.ItemQtyCommitted > 0 select items;</code>
该查询仅过滤数据;它没有实现 SQL CASE 语句的逻辑。
为了更清楚地说明 LINQ 的 CASE 语句等效项,让我们看一个更简单的示例:
<code class="language-csharp">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" ) } );</code>
这演示了如何使用三元条件运算符 (?:
) 来模拟 CASE 语句的行为。 条件按顺序进行评估,为每次匹配返回适当的值。结果是一系列匿名对象,每个对象都包含一个数字及其文本表示形式。 将此原则应用于原始 SQL CASE 语句需要在 LINQ 查询中使用类似的嵌套条件方法,使其适应 db.cdsItems
中的特定数据结构和关系,并可能与其他表连接以访问 itempromoflag
、itemcat1
和itemsalestatus
。 如果前面的条件都不满足,则 ELSE
条件将表示默认值。
以上是如何有效地将SQL CASE语句转换为LINQ查询?的详细内容。更多信息请关注PHP中文网其他相关文章!