Выбор
Dapper ORM чем то аргументирован?
Если Вам действительно нужна та скорость с которой даппер маппит, но Вы готовы пожертвовать скоростью написания кода тогда делайте так:
1. Реализуем
SqlBuilder под все нужды:
public interface ISqlBuilder
{
SqlBuilder.Template AddTemplate(string sql, dynamic parameters = null);
ISqlBuilder LeftJoin(string sql, dynamic parameters = null);
ISqlBuilder PagingLeftJoin(string sql, dynamic parameters = null);
ISqlBuilder Where(string sql, dynamic parameters = null);
ISqlBuilder PagingWhere(string sql, dynamic parameters = null);
ISqlBuilder OrderBy(string sql, dynamic parameters = null);
ISqlBuilder PagingOrderBy(string sql);
ISqlBuilder Select(string sql, dynamic parameters = null);
ISqlBuilder AddParameters(dynamic parameters);
ISqlBuilder Join(string sql, dynamic parameters = null);
ISqlBuilder GroupBy(string sql, dynamic parameters = null);
ISqlBuilder Having(string sql, dynamic parameters = null);
}
2. Под каждое конструирование запросов пишем свой класс, реализуем интерфейс
IQueryBuilder для дальнейшей инъекции зависимости в сервисах:
using Dapper;
public class MyEntityQueryBuilder : IQueryBuilder<T>
where T: IEntity
{
private readonly ISqlBuilder _sqlBuilder;
private readonly SqlBuilder.Template _entityTemplate;
private readonly string entity_template = @"
select
/**select**/
from
entity_table e
/**leftjoin**/
/**where**/
/**orderby**/
";
private readonly string split_on = "Id";
public MyEntityQueryBuilder(ISqlBuilder sqlBuilder)
{
_sqlBuilder = sqlBuilder.AddTemplate(entity_template);
}
public Query Build(EntityFilter filter)
{
Select();
LeftJoin();
Where(filter);
Order();
return new Query
{
Sql = _entityTemplate.RawSql,
Parameters = _entityTemplate.Parameters,
SplitOn = split_on,
};
}
private void Select()
{
_builder.Select("e.Id");
_builder.Select("e.Title");
}
private void LeftJoin()
{
_builder.LeftJoin("asn_Responsibles r1 on r1.Id = e.MainResponsibleId");
_builder.LeftJoin("asn_EventResponsibles er on er.EventId = e.Id");
}
private void Where(EntityFilter filter)
{
_builder.Where("e.IsDeleted = 0");
if (filter == null)
{
return;
}
if (filter.Id.HasValue)
{
_builder.Where("e.Id = @id", new { id = filter.Id });
}
if (filter.IsRootOnly)
{
_builder.Where("e.ParentId is null");
}
}
private void Order()
{
_builder.OrderBy("e.CreateDate");
}
}
3. Нужен абстрактный репозиторий? Реализуйте IRepository и инжекте уже туда Ваши свежеиспеченные QueryBuilders для дальнейшего маппинга даппером.
Удачи (: