using System; using System.Collections.Generic; using System.Linq.Expressions; using Luticate2.Utils.Dbo.Result; using Microsoft.EntityFrameworkCore; namespace Luticate2.Utils.DataAccess { public abstract class LuEfDataAccess : LuDataAccess where TModel : class where TDbContext : DbContext { private readonly IServiceProvider _serviceProvider; protected LuEfDataAccess(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } protected abstract DbSet GetTable(TDbContext db); public LuResult Execute(Func, LuResult> func) { try { using (var db = (TDbContext)_serviceProvider.GetService(typeof(TDbContext))) { var table = GetTable(db); return func(db, table); } } catch (Exception e) { return LuResult.Error(LuStatus.DbError, e); } } public static Expression> GetExpression(params KeyValuePair[] keys) { var param = Expression.Parameter(typeof(TModel), "x"); Expression totalExp = null; foreach (var pair in keys) { var equalExp = Expression.Equal(Expression.Property(param, pair.Key), Expression.Constant(pair.Value)); totalExp = totalExp == null ? equalExp : Expression.And(equalExp, totalExp); } return Expression.Lambda>(totalExp, param); } } }