【C#】LtQueryの書き込み処理が完成

概要

LtQuery(リトルクエリ)はEF CoreのようにLINQやInclude()でSQLを構築する機能が備わっていてかつ、パフォーマンスがDapperを凌いでいるといういいとこ取りの高速O/Rマッパー(ORM)です。

それの書き込み処理(Inert/Update/Delete)が完成致しました。

これでようやくv1.0.0です。

使用例

class BlogService
{
    readonly ILtConnection _connection;
    public BlogService(ILtConnection connection)
    {
        _connection = connection;
    }

    // UnitsOfWorkを使用しないパターン
    public void AddBlog(Blog blog)
    {
        _connection.Add(blog); // 即時実行される
    }

    // UnitsOfWorkを使用するパターン
    public void AddBlog2(Blog blog)
    {
        using (var unitOfWork = _connection.CreateUnitOfWork())
        {
            unitOfWork.Add(blog);

            unitOfWork.Commit();  // まとめて実行される
        }
    }
}

_connection.Add() を使用した場合はクエリを即発行します。こちらはトランザクションを自身で管理したい場合に使います。unitOfWork.Add() は標準の書き込み方です。Commit()時に蓄積したクエリをまとめて発行します。EF Core 同様Add()されたエンティティはIDが付与されます。EF Coreのようなトレース機能はありません。パフォーマンス第一ですのでこれで十分かと思います。

class BlogApplicationService
{
    readonly ILtUnitOfWork _unitOfWork;
    public BlogApplicationService(ILtUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

ILtUnitOfWork はDIコンテナにScopedで登録されています。ILtUnitOfWorkILtConnection と同様Select/Single/Firstのメソッドを持っているためわざわざ ILtConnection と使い分ける必要はなく、上記コードのような使い方もできます。

現状の問題点

  • 書き込み処置のSQLは1件ずつ発行しているためEF Coreより多少遅い問題が発生しています(少数の書き込みなら断然速い)。時期に改善致します。 改善しました。
  • 自動採番(IDENTITY)でない主キーのエンティティの書き込みは対応していません。これも時期に改善致します。

コメント

タイトルとURLをコピーしました