Advertisement
simonradev

Extensions

Nov 28th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.88 KB | None | 0 0
  1. public static class DbSetExtensionMethods
  2.     {
  3.         private static readonly Type EnumerableType = typeof(Enumerable);
  4.         private static readonly Type IEnumerableGenericType = typeof(IEnumerable<>);
  5.         private const string SingleOrDefaultMethodName = "SingleOrDefault";
  6.  
  7.         public static TEntity Find<TEntity>(this DbSet<TEntity> dbSet, Func<TEntity, bool> predicate)
  8.             where TEntity : class
  9.         {
  10.             Type entityType = typeof(TEntity);
  11.             ParameterExpression dbSetParameter = Expression.Parameter(IEnumerableGenericType.MakeGenericType(entityType),
  12.                                                                       nameof(dbSet));
  13.             ParameterExpression filterParamater = Expression.Parameter(predicate.GetType(),
  14.                                                                        nameof(predicate));
  15.  
  16.             Type[] typeArguments = new Type[] { entityType };
  17.             Expression[] methodArguments = new Expression[] { dbSetParameter, filterParamater };
  18.             MethodCallExpression singleOrDefaultCall = Expression.Call(EnumerableType,
  19.                                                                        SingleOrDefaultMethodName,
  20.                                                                        typeArguments,
  21.                                                                        methodArguments);
  22.  
  23.             Func<DbSet<TEntity>, Func<TEntity, bool>, TEntity> compiledSingleOrDefaultCall =
  24.                 Expression.Lambda<Func<DbSet<TEntity>, Func<TEntity, bool>, TEntity>>(singleOrDefaultCall,
  25.                                                                                       dbSetParameter,
  26.                                                                                       filterParamater).Compile();
  27.  
  28.             return compiledSingleOrDefaultCall(dbSet, predicate);
  29.         }
  30.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement