# 機能設計書 42-LINQ統合

## 概要

本ドキュメントは、F#コアライブラリにおけるLINQ（Language Integrated Query）との統合機能の設計を記述する。

### 本機能の処理概要

LINQ統合機能は、F#のシーケンス処理とC#/VB.NETのLINQ（System.Linq）との相互運用性を提供する。F#のコレクション処理関数をLINQ式として表現可能にし、Entity FrameworkなどのLINQプロバイダーとの連携を実現する。

**業務上の目的・背景**：.NETエコシステム全体でLINQは標準的なデータクエリ機構として広く採用されている。F#からLINQベースのライブラリ（Entity Framework、LINQ to XML等）を利用する際の相互運用性を確保し、既存の.NET資産を活用可能にする。

**機能の利用シーン**：
- Entity Frameworkを使用したデータベースクエリ
- LINQ to XMLによるXMLドキュメント操作
- LINQ to Objectsによるインメモリコレクション処理
- 他の.NET言語との相互運用

**主要な処理内容**：
1. F#の式ツリー（Quotations）からLINQ Expression Treeへの変換
2. IQueryable/IEnumerableインターフェースのサポート
3. LINQ演算子のF#ラッパー関数の提供
4. Nullable型の演算サポート

**関連システム・外部連携**：System.Linq名前空間、LINQプロバイダー（Entity Framework等）

**権限による制御**：特になし（純粋なライブラリ機能）

## 関連画面

本機能はコアライブラリ機能のため、直接関連する画面はない。

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | - |

## 機能種別

データアクセス / クエリ変換

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| source | IQueryable<'T> / IEnumerable<'T> | Yes | データソース | null不可 |
| expression | Expr<'T> | No | F#式ツリー | 有効なF#式 |

### 入力データソース

- IQueryable<'T>: データベースや外部データソース
- IEnumerable<'T>: インメモリコレクション

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| クエリ結果 | IQueryable<'T> / IEnumerable<'T> | 変換後のクエリまたは結果 |

### 出力先

メモリ上のオブジェクト、またはLINQプロバイダーへのクエリ式

## 処理フロー

### 処理シーケンス

```
1. F#式ツリーの受け取り
   └─ Quotationsモジュールで式を取得
2. 式ツリーの解析
   └─ パターンマッチで式の構造を解析
3. LINQ Expression Treeへの変換
   └─ LeafExpressionConverterで変換
4. クエリプロバイダーへの送出
   └─ IQueryableインターフェース経由
5. 結果の取得と変換
   └─ F#型への変換
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[F#式を受け取る]
    B --> C{IQueryable?}
    C -->|Yes| D[Expression Treeへ変換]
    C -->|No| E[IEnumerableとして処理]
    D --> F[クエリプロバイダーで実行]
    E --> G[インメモリで評価]
    F --> H[結果をF#型に変換]
    G --> H
    H --> I[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | IQueryable優先 | IQueryableソースはサーバーサイド評価を試行 | データベースクエリ |
| BR-02 | 自動フォールバック | サポートされない式はクライアント評価 | 複雑な式 |
| BR-03 | Nullable透過 | Nullable型の演算を自然にサポート | 数値演算 |

### 計算ロジック

LINQ演算子とF#関数の対応:
- `Enumerable.Select` -> `Seq.map`
- `Enumerable.Where` -> `Seq.filter`
- `Enumerable.SelectMany` -> `Seq.collect`
- `Enumerable.OrderBy/OrderByDescending` -> `Seq.sortBy`
- `Enumerable.GroupBy` -> `Seq.groupBy`
- `Enumerable.Aggregate` -> `Seq.fold`

## データベース操作仕様

LINQプロバイダー（Entity Framework等）経由での操作となるため、本機能自体はSQLを直接発行しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| InvalidOperationException | 実行時エラー | サポートされない式 | 式を簡略化またはクライアント評価に変更 |
| NotSupportedException | 実行時エラー | プロバイダー非サポート機能 | 代替手段を使用 |
| ArgumentNullException | 実行時エラー | nullソース | nullチェックを追加 |

### リトライ仕様

該当なし（クエリ変換の失敗は即座にエラー）

## トランザクション仕様

該当なし（トランザクション管理はLINQプロバイダーが担当）

## パフォーマンス要件

- Expression Treeへの変換はオンデマンドで実行
- 遅延評価によりメモリ使用量を最小化
- IQueryableの場合、可能な限りサーバーサイド評価

## セキュリティ考慮事項

- SQLインジェクション防止はLINQプロバイダーが担当
- 動的に構築されるクエリ式の検証を推奨

## 備考

F#のLINQ統合は、query { } コンピュテーション式を通じて使用されることが多い。

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

LINQ統合の基盤となるデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Linq.fs | `src/FSharp.Core/Linq.fs` | LeafExpressionConverterモジュールで式変換の基本を把握 |
| 1-2 | Linq.fs | `src/FSharp.Core/Linq.fs` | Adaptersモジュールでクエリアダプターを理解 |

**読解のコツ**: LeafExpressionConverterがF#式からLINQ Expression Treeへの変換の中核を担う。

#### Step 2: エントリーポイントを理解する

LINQ統合のエントリーポイントとなる関数群。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Linq.fs | `src/FSharp.Core/Linq.fs` | QuotationToExpressionで式変換 |
| 2-2 | Linq.fs | `src/FSharp.Core/Linq.fs` | EvaluateQuotationで式の評価 |

**主要処理フロー**:
1. F# Quotationを受け取る
2. LeafExpressionConverterで変換処理
3. System.Linq.Expressions.Expressionとして出力

#### Step 3: 式変換処理を理解する

F#式からLINQ式への変換ロジックを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Linq.fs | `src/FSharp.Core/Linq.fs` | ConvExprで再帰的な式変換 |
| 3-2 | Linq.fs | `src/FSharp.Core/Linq.fs` | ConvVarで変数変換 |

#### Step 4: Nullable演算を理解する

Nullable型の演算サポートを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Nullable.fs | `src/FSharp.Core/Nullable.fs` | NullableOperatorsモジュールでNullable演算子を確認 |

### プログラム呼び出し階層図

```
LINQ クエリ (query { } または直接呼び出し)
    │
    ├─ QueryBuilder.Run
    │      └─ RunQueryAsQueryable / RunQueryAsEnumerable
    │             └─ ForwardDeclarations.Query.Execute
    │
    ├─ LeafExpressionConverter
    │      ├─ QuotationToExpression (式変換)
    │      │      └─ ConvExpr (再帰的変換)
    │      │             ├─ ConvVar (変数変換)
    │      │             ├─ ConvCall (メソッド呼び出し変換)
    │      │             └─ ConvLambda (ラムダ式変換)
    │      │
    │      └─ EvaluateQuotation (式評価)
    │
    └─ IQueryProvider.Execute (プロバイダー実行)
```

### データフロー図

```
[入力]                    [処理]                           [出力]

F# Quotation     ───▶  LeafExpressionConverter  ───▶  LINQ Expression
  Expr<'T>              (式変換)                       Expression<Func<...>>
    │
    ▼
IQueryable       ───▶  IQueryProvider           ───▶  クエリ結果
  データソース          (プロバイダー実行)              IEnumerable<'T>
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Linq.fs | `src/FSharp.Core/Linq.fs` | ソース | LINQ統合の主要実装 |
| Nullable.fs | `src/FSharp.Core/Nullable.fs` | ソース | Nullable型演算サポート |
| Query.fs | `src/FSharp.Core/Query.fs` | ソース | クエリビルダー実装 |
| quotations.fs | `src/FSharp.Core/quotations.fs` | ソース | F#式ツリー定義 |
