diff --git a/zero.Sqlite/Operations/DbOperations.Read.cs b/zero.Sqlite/Operations/DbOperations.Read.cs
index 19e9d5ee..139da96e 100644
--- a/zero.Sqlite/Operations/DbOperations.Read.cs
+++ b/zero.Sqlite/Operations/DbOperations.Read.cs
@@ -4,6 +4,7 @@ using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using ServiceStack.OrmLite;
+using ServiceStack.OrmLite.Dapper;
using zero.Extensions;
using zero.Models;
using zero.Utils;
@@ -67,125 +68,30 @@ public partial class DbOperations : IDbOperations
}
- // ///
- // public virtual async Task Any(Func, IQueryable> querySelector = default) where T : ZeroIdEntity, new()
- // {
- // querySelector ??= x => x;
- // return await querySelector(Session.Query()).AnyAsync();
- // }
- //
- //
- // ///
- // public virtual async Task> Load(int pageNumber, int pageSize, Func, IQueryable> querySelector = default) where T : ZeroIdEntity, new()
- // {
- // IRavenQueryable queryable = Session.Query().Statistics(out QueryStatistics statistics);
- // querySelector ??= x => x;
- //
- // List result = await querySelector(queryable).Paging(pageNumber, pageSize).ToListAsync();
- // return new Paged(result, statistics.TotalResults, pageNumber, pageSize);
- // }
- //
- //
- // ///
- // public virtual async Task> Load(int pageNumber, int pageSize, Func, IQueryable> querySelector = default)
- // where T : ZeroIdEntity, new()
- // where TIndex : AbstractCommonApiForIndexes, new()
- // {
- // IRavenQueryable queryable = Session.Query().Statistics(out QueryStatistics statistics);
- // querySelector ??= x => x;
- //
- // List result = await querySelector(queryable).Paging(pageNumber, pageSize).ToListAsync();
- // return new Paged(result, statistics.TotalResults, pageNumber, pageSize);
- // }
- //
- //
- // ///
- // public virtual async Task> Load(Func, IQueryable> querySelector) where T : ZeroIdEntity, new()
- // {
- // IRavenQueryable queryable = Session.Query();
- // querySelector ??= x => x;
- //
- // return await querySelector(queryable).ToListAsync();
- // }
- //
- //
- // ///
- // public virtual async Task> Load(Func, IQueryable> querySelector)
- // where T : ZeroIdEntity, new()
- // where TIndex : AbstractCommonApiForIndexes, new()
- // {
- // IRavenQueryable queryable = Session.Query();
- // querySelector ??= x => x;
- //
- // return await querySelector(queryable).ToListAsync();
- // }
- //
- //
- // ///
- // public virtual async Task> Load(Expression> predicate) where T : ZeroIdEntity, new()
- // {
- // return await Session.Query().Where(predicate).ToListAsync();
- // }
- //
- //
- // ///
- // public virtual async Task> Load(Expression> predicate)
- // where T : ZeroIdEntity, new()
- // where TIndex : AbstractCommonApiForIndexes, new()
- // {
- // return await Session.Query().Where(predicate).ToListAsync();
- // }
- //
- //
- // ///
- // public virtual async Task> Load(int pageNumber, int pageSize, Func, IQueryable> querySelector = default)
- // where T : ZeroIdEntity, new()
- // where TProjection : ZeroIdEntity, new()
- // where TIndex : AbstractCommonApiForIndexes, new()
- // {
- // IRavenQueryable queryable = Session.Query().Statistics(out QueryStatistics statistics);
- // querySelector ??= x => x;
- //
- // List result = await querySelector(queryable).ProjectInto().Paging(pageNumber, pageSize).ToListAsync();
- // return new Paged(result, statistics.TotalResults, pageNumber, pageSize);
- // }
- //
- //
- // ///
- // public virtual async Task> LoadAll() where T : ZeroIdEntity, new()
- // {
- // List items = new();
- //
- // await foreach (T item in Stream(null))
- // {
- // items.Add(item);
- // }
- //
- // return items;
- // }
- //
- //
- // ///
- // public virtual async IAsyncEnumerable Stream(Func, IQueryable> expression) where T : ZeroIdEntity, new()
- // {
- // IRavenQueryable query = Session.Query();
- // IQueryable queryable = query;
- //
- // if (expression != null)
- // {
- // queryable = expression(query);
- // }
- //
- // var stream = await Session.Advanced.StreamAsync(queryable);
- //
- // while (await stream.MoveNextAsync())
- // {
- // if (WhenActive(stream.Current.Document) == default)
- // {
- // continue;
- // }
- //
- // yield return stream.Current.Document;
- // }
- // }
+ ///
+ public virtual async Task Any(Expression> querySelector = null) where T : ZeroIdEntity, new()
+ {
+ return await Db.ExistsAsync(querySelector ?? (x => true));
+ }
+
+
+ ///
+ public virtual async Task> Load(Expression> querySelector) where T : ZeroIdEntity, new()
+ {
+ return await Db.SelectAsync(querySelector ?? (x => true));
+ }
+
+
+ ///
+ public virtual async Task> LoadBySql(Func, SqlExpression> querySelector) where T : ZeroIdEntity, new()
+ {
+ return await Db.SelectAsync(querySelector(Db.From()));
+ }
+
+
+ ///
+ public virtual async Task> LoadAll() where T : ZeroIdEntity, new()
+ {
+ return await Db.SelectAsync(x => true);
+ }
}
\ No newline at end of file
diff --git a/zero.Sqlite/Operations/DbOperations.cs b/zero.Sqlite/Operations/DbOperations.cs
index 419b98b4..ad170dd9 100644
--- a/zero.Sqlite/Operations/DbOperations.cs
+++ b/zero.Sqlite/Operations/DbOperations.cs
@@ -151,6 +151,27 @@ public interface IDbOperations
///
Task> LoadAsList(IEnumerable ids) where T : ZeroIdEntity, new();
+ ///
+ /// Check if any items exist in this collection (with optional query)
+ ///
+ Task Any(Expression> querySelector = null) where T : ZeroIdEntity, new();
+
+ ///
+ /// Get entities by query
+ ///
+ Task> Load(Expression> querySelector) where T : ZeroIdEntity, new();
+
+ ///
+ /// Get entities by sql query
+ ///
+ Task> LoadBySql(Func, SqlExpression> querySelector) where T : ZeroIdEntity, new();
+
+ ///
+ /// Get all entities from this collection.
+ /// Warning: Don't use this method for large collections. Stream the results instead.
+ ///
+ Task> LoadAll() where T : ZeroIdEntity, new();
+
///
/// Creates an entity with an optional validator
///
diff --git a/zero/Localization/FluentValidationGermanLanguage.cs b/zero/Localization/FluentValidationGermanLanguage.cs
new file mode 100644
index 00000000..b5556516
--- /dev/null
+++ b/zero/Localization/FluentValidationGermanLanguage.cs
@@ -0,0 +1,37 @@
+namespace zero.Localization;
+
+public class FluentValidationGermanLanguage
+{
+ public static readonly Dictionary Translations = new()
+ {
+ { "EmailValidator", "Keine gültige E-Mail-Adresse" },
+ { "GreaterThanOrEqualValidator", "Der Wert muss grösser oder gleich '{ComparisonValue}' sein." },
+ { "GreaterThanValidator", "Der Wert muss grösser sein als '{ComparisonValue}'." },
+ { "LengthValidator", "Die Länge muss zwischen {MinLength} und {MaxLength} Zeichen liegen. Es wurden {TotalLength} Zeichen eingetragen." },
+ { "MinimumLengthValidator", "Die Länge muss größer oder gleich {MinLength} sein. Sie haben {TotalLength} Zeichen eingegeben." },
+ { "MaximumLengthValidator", "Die Länge muss kleiner oder gleich {MaxLength} sein. Sie haben {TotalLength} Zeichen eingegeben." },
+ { "LessThanOrEqualValidator", "Der Wert muss kleiner oder gleich '{ComparisonValue}' sein." },
+ { "LessThanValidator", "Der Wert muss kleiner sein als '{ComparisonValue}'." },
+ { "NotEmptyValidator", "Dieses Feld darf nicht leer sein." },
+ { "NotEqualValidator", "Dieser Wert darf nicht '{ComparisonValue}' sein." },
+ { "NotNullValidator", "Dieses Feld darf nicht leer sein." },
+ { "PredicateValidator", "Der Wert entspricht nicht der festgelegten Bedingung." },
+ { "AsyncPredicateValidator", "Der Wert entspricht nicht der festgelegten Bedingung." },
+ { "RegularExpressionValidator", "Dieses Feld weist ein ungültiges Format auf." },
+ { "EqualValidator", "Der Wert muss gleich '{ComparisonValue}' sein." },
+ { "ExactLengthValidator", "Dieses Feld muss genau {MaxLength} lang sein. Es wurden {TotalLength} eingegeben." },
+ { "ExclusiveBetweenValidator", "Der Wert muss zwischen {From} und {To} sein (exklusiv). Es wurde {PropertyValue} eingegeben." },
+ { "InclusiveBetweenValidator", "Der Wert muss zwischen {From} and {To} sein. Es wurde {PropertyValue} eingegeben." },
+ { "CreditCardValidator", "Keine gültige Kreditkartennummer." },
+ { "ScalePrecisionValidator", "Das Feld darf insgesamt nicht mehr als {ExpectedPrecision} Ziffern enthalten, mit Berücksichtigung von {ExpectedScale} Dezimalstellen. Es wurden {Digits} Ziffern und {ActualScale} Dezimalstellen gefunden." },
+ { "EmptyValidator", "Dieses Feld sollte leer sein." },
+ { "NullValidator", "Dieses Feld sollte leer sein." },
+ { "EnumValidator", "Dieses Feld hat einen Wertebereich, der '{PropertyValue}' nicht enthält." },
+ // Additional fallback messages used by clientside validation integration.
+ { "Length_Simple", "Die Länge muss zwischen {MinLength} und {MaxLength} Zeichen liegen." },
+ { "MinimumLength_Simple", "Die Länge muss größer oder gleich {MinLength} sein." },
+ { "MaximumLength_Simple", "Die Länge muss kleiner oder gleich {MaxLength} sein." },
+ { "ExactLength_Simple", "Dieses Feld muss genau {MaxLength} lang sein." },
+ { "InclusiveBetween_Simple", "Der Wert muss zwischen {From} and {To} sein." }
+ };
+}
\ No newline at end of file
diff --git a/zero/Localization/LanguageManagerExtensions.cs b/zero/Localization/LanguageManagerExtensions.cs
new file mode 100644
index 00000000..42db29aa
--- /dev/null
+++ b/zero/Localization/LanguageManagerExtensions.cs
@@ -0,0 +1,18 @@
+using FluentValidation.Resources;
+
+namespace zero.Localization;
+
+public static class LanguageManagerExtensions
+{
+ public static ILanguageManager AddGermanOverrides(this ILanguageManager manager)
+ {
+ if (manager is LanguageManager languageManager)
+ {
+ foreach (var kvp in FluentValidationGermanLanguage.Translations)
+ {
+ languageManager.AddTranslation("de", kvp.Key, kvp.Value);
+ }
+ }
+ return manager;
+ }
+}
\ No newline at end of file
diff --git a/zero/Localization/ZeroLocalizationModule.cs b/zero/Localization/ZeroLocalizationModule.cs
index 45d3e938..3a41a6d6 100644
--- a/zero/Localization/ZeroLocalizationModule.cs
+++ b/zero/Localization/ZeroLocalizationModule.cs
@@ -1,4 +1,5 @@
-using Microsoft.AspNetCore.Mvc.Localization;
+using FluentValidation;
+using Microsoft.AspNetCore.Mvc.Localization;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
@@ -12,6 +13,8 @@ internal class ZeroLocalizationModule : ZeroModule
{
// hint: think about using https://github.com/nuages-io/nuages-localization
+ ValidatorOptions.Global.LanguageManager.AddGermanOverrides();
+
services.AddScoped();
services.AddScoped();
services.AddScoped();