ホームページ >データベース >mysql チュートリアル >SQL CASE ステートメントを LINQ クエリに効果的に変換するにはどうすればよいですか?
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 中国語 Web サイトの他の関連記事を参照してください。