Files
Umbraco-CMS/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/SimpleGetRepository.cs

98 lines
3.3 KiB
C#
Raw Normal View History

2017-07-20 11:21:28 +02:00
using System;
using System.Collections.Generic;
using System.Linq;
2020-09-17 09:42:55 +02:00
using Microsoft.Extensions.Logging;
using NPoco;
using Umbraco.Core.Cache;
2017-12-12 15:04:13 +01:00
using Umbraco.Core.Exceptions;
using Umbraco.Core.Models.Entities;
using Umbraco.Core.Persistence.Querying;
2017-12-12 15:04:13 +01:00
using Umbraco.Core.Scoping;
2017-12-07 16:45:25 +01:00
namespace Umbraco.Core.Persistence.Repositories.Implement
{
// TODO: Obsolete this, change all implementations of this like in Dictionary to just use custom Cache policies like in the member repository.
/// <summary>
/// Simple abstract ReadOnly repository used to simply have PerformGet and PeformGetAll with an underlying cache
/// </summary>
2020-12-22 10:30:16 +11:00
internal abstract class SimpleGetRepository<TId, TEntity, TDto> : EntityRepositoryBase<TId, TEntity>
where TEntity : class, IEntity
where TDto: class
{
2020-09-17 09:42:55 +02:00
protected SimpleGetRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger<SimpleGetRepository<TId, TEntity, TDto>> logger)
2017-12-14 17:04:44 +01:00
: base(scopeAccessor, cache, logger)
2017-12-12 15:04:13 +01:00
{ }
protected abstract TEntity ConvertToEntity(TDto dto);
protected abstract object GetBaseWhereClauseArguments(TId id);
protected abstract string GetWhereInClauseForGetAll();
protected virtual IEnumerable<TDto> PerformFetch(Sql sql)
{
return Database.Fetch<TDto>(sql);
2017-07-20 11:21:28 +02:00
}
protected override TEntity PerformGet(TId id)
{
var sql = GetBaseQuery(false);
sql.Where(GetBaseWhereClause(), GetBaseWhereClauseArguments(id));
var dto = PerformFetch(sql).FirstOrDefault();
if (dto == null)
return null;
var entity = ConvertToEntity(dto);
if (entity is EntityBase dirtyEntity)
{
2017-11-10 11:27:12 +01:00
// reset dirty initial properties (U4-1946)
2017-07-20 11:21:28 +02:00
dirtyEntity.ResetDirtyProperties(false);
}
return entity;
}
protected override IEnumerable<TEntity> PerformGetAll(params TId[] ids)
{
var sql = Sql().From<TEntity>();
if (ids.Any())
{
sql.Where(GetWhereInClauseForGetAll(), new { /*ids =*/ ids });
}
2017-07-20 11:21:28 +02:00
return Database.Fetch<TDto>(sql).Select(ConvertToEntity);
}
2017-08-26 17:39:23 +02:00
protected sealed override IEnumerable<TEntity> PerformGetByQuery(IQuery<TEntity> query)
{
var sqlClause = GetBaseQuery(false);
var translator = new SqlTranslator<TEntity>(sqlClause, query);
var sql = translator.Translate();
return Database.Fetch<TDto>(sql).Select(ConvertToEntity);
}
#region Not implemented and not required
2017-08-26 17:39:23 +02:00
protected sealed override IEnumerable<string> GetDeleteClauses()
{
throw new InvalidOperationException("This method won't be implemented.");
}
protected sealed override Guid NodeObjectTypeId => throw new InvalidOperationException("This property won't be implemented.");
2017-08-26 17:39:23 +02:00
protected sealed override void PersistNewItem(TEntity entity)
{
throw new InvalidOperationException("This method won't be implemented.");
}
2017-08-26 17:39:23 +02:00
protected sealed override void PersistUpdatedItem(TEntity entity)
{
throw new InvalidOperationException("This method won't be implemented.");
}
2017-12-12 15:04:13 +01:00
#endregion
}
2017-07-20 11:21:28 +02:00
}