【C#】JQuery DataTablesを利用した時のリクエスト／レスポンス用のクラス

# C#でDataTables
DataTablesの機能として、サーバーサイド実装を選択し、リクエストとレスポンスを制御する実装を行う場合、リクエストとレスポンスに対応するクラスが必要だったので作った。
またC#で作る時に使えそうなので残す！

# リクエスト用のクラス
```cs:Request/RequestRoot.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DataTables.Request
{
    /// <summary>
    /// DataTables からのリクエストオブジェクトを提供します。
    /// </summary>
    public class RequestRoot
    {
        /// <summary>
        /// 描画回数を取得または設定します。
        /// </summary>
        public int Draw { get; set; }

        /// <summary>
        /// 列情報を取得または設定します。
        /// </summary>
        public Column[] Columns { get; set; }

        /// <summary>
        /// ソート情報を取得または設定します。
        /// </summary>
        public Order[] Order { get; set; }

        /// <summary>
        /// 開始インデックスを取得または設定します。
        /// </summary>
        public int Start { get; set; }

        /// <summary>
        /// 抽出件数を取得または設定します。
        /// </summary>
        public int Length { get; set; }

        /// <summary>
        /// 検索情報を取得または設定します。
        /// </summary>
        public Search Search { get; set; }
    }
}
```

```cs:Request/Column.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DataTables.Request
{
    /// <summary>
    /// DataTables からのリクエスト列オブジェクトを提供します。
    /// </summary>
    public class Column
    {
        /// <summary>
        /// dataプロパティを取得または設定します。
        /// </summary>
        public string Data { get; set; }

        /// <summary>
        /// nameプロパティを取得または設定します。
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 検索可能かどうかを取得または設定します。
        /// </summary>
        public bool Searchable { get; set; }

        /// <summary>
        /// ソート可能かどうかを取得または設定します。
        /// </summary>
        public bool Orderable { get; set; }

        /// <summary>
        /// 検索情報を取得または設定します。
        /// </summary>
        public Search Search { get; set; }
    }
}
```

```cs:Request/Order.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DataTables.Request
{
    /// <summary>
    /// DataTables からのリクエストソートオブジェクトを提供します。
    /// </summary>
    public class Order
    {
        /// <summary>
        /// ソート列インデックスを取得または設定します。
        /// </summary>
        public int Column { get; set; }

        /// <summary>
        /// ソート方向を取得または設定します。
        /// </summary>
        public string Dir { get; set; }
    }
}
```

```cs:Request/Search.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DataTables.Request
{
    /// <summary>
    /// DataTables からのリクエスト検索オブジェクトを提供します。
    /// </summary>
    public class Search
    {
        /// <summary>
        /// 検索値を取得または設定します。
        /// </summary>
        public string Value { get; set; }

        /// <summary>
        /// 正規表現を利用するかどうかを設定します。
        /// </summary>
        public bool Regex { get; set; }
    }
}
```

# レスポンス用のクラス
```cs:Response/ResponseRoot.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DataTables.Response
{
    /// <summary>
    /// DataTables へのレスポンスオブジェクトを提供します。
    /// </summary>
    /// <typeparam name="T">レスポンスデータ型。</typeparam>
    public class ResponseRoot<T>
    {
        /// <summary>
        /// 描画回数を取得または設定します。
        /// </summary>
        public int Draw { get; set; }

        /// <summary>
        /// 全レコード件数を取得または設定します。
        /// </summary>
        public int RecordsTotal { get; set; }

        /// <summary>
        /// 検索を行った件数を取得または設定します。
        /// </summary>
        public int RecordsFiltered { get; set; }

        /// <summary>
        /// レスポンスデータを取得または設定します。
        /// </summary>
        public List<T> Data { get; set; } = new List<T>();
    }
}
```

# 使い方
```cs
[ApiController]
public class SendSettingsController : ControllerBase
{
	[HttpPost]
	[Route("list")]
	public ActionResult FindList([FromBody] RequestRoot request)
	{
		Console.WriteLine(request.Draw);
		
		var result = new ResponseRoot<ListItems>()
		{
			Draw = request.Draw
		};
		result.Data.Add(new ListItems()
		{
			Column1 = "hoge",
			Column2 = 100,
			Column3 = true
		});
		
		return new JsonResult(result);
	}
}

public class ListItems
{
	public string Column1 { get; set; }
	public int Column2 { get; set; }
	public bool Column3 { get; set; }
}
```

ついでに、リクエストのOrderは列インデックスと"asc"/"desc"で渡ってくるので、どっかの実装で、こんなことすると、列情報が扱いやすくなる。
LINQだろうがSQLだろうが、OrderByする時に項目名が欲しいはずなので。

```cs
using System;
using System.Collections.Generic;
using System.Text;

namespace DataTables.Request
{
    /// <summary>
    /// 検索方向を提供します。
    /// </summary>
    public enum OrderDirection
    {
        /// <summary>
        /// 昇順。
        /// </summary>
        Asc,

        /// <summary>
        /// 降順。
        /// </summary>
        Desc
    }
}

// 設定されているソート項目分、ごにょごにょする
foreach (var order in Order)
{
	// Orderのインデックス(Columnプロパティ)から、Columnオブジェクトを得る
	var column = Columns[order.Column].Data;
	
	// Orderのソート順(Dirプロパティ)から、Enumとして得る
	var direction = Enum.Parse<OrderDirection>(System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(order.Dir))
}
```