RalmsDeveloper
Ele é escrito em C#
Não é uma continuidade do EF 6.x
Podemos usar LINQ(Consulta integrada a linguagem)
var talksList = new[] { "EF", "DDD", "ARQUITETURA" }; var talks = talksList .Where(p => p == "EF") .OrderBy(p => p) .Skip(1) .Take(1) .ToArray();
Essas consultas são executadas em memória
Func<int, bool> maiorQue10 = i => i > 10;
Expression<Func<int, bool>> maiorQue10Expression = i => i > 10;
Func<int, bool> maiorQue10ExpressionCompilada = maiorQue10Expression.Compile();
var parametro1 = Expression.Parameter(typeof(int), "i"); Expression<Func<int, bool>> expressionLambda = Expression.Lambda<Func<int, bool>>( Expression.GreaterThan( parametro1, Expression.Constant(10)), parametro1); var maiorQue10Lambda = expressionLambda.Compile();
var parametro1 = Expression.Parameter(typeof(int), "i"); Expression<Func<int, bool>> expressionLambda = Expression.Lambda<Func<int, bool>>( Expression.GreaterThan( parametro1, Expression.Constant(10)), parametro1); var maiorQue10Lambda = expressionLambda.Compile();
new[] { 10, 11, 12 }.Where(maiorQue10);
new[] { 10, 11, 12 }.Where(maiorQue10ExpressionCompilada);
new[] { 10, 11, 12 }.Where(maiorQue10Lambda);
Func<string, string> toLower = str => str.ToLower();
new[] { "Rafael", "Almeida" }.Select(p => toLower(p)).ToList();
/* Count = 2
[0]: "rafael"
[1]: "almeida"
*/
var parametro = Expression.Parameter(typeof(string), "str"); var toLower = typeof(string).GetMethod("ToLower", Type.EmptyTypes); var body = Expression.Call(parametro, toLower); var lambda = Expression.Lambda<Func<string, string>>(body, parametro); var compiledToLower = lambda.Compile();
new[] { "Rafael", "Almeida" }.Select(p => compiledToLower(p)).ToList();
/* Count = 2
[0]: "rafael"
[1]: "almeida"
*/
IEnumerable<T>.Where(Func<T, bool> predicate)
IQueryable<T>.Where(Expression<Func<T, bool>> predicate)
var resultado = db .Livros .Where(p => p.Descricao == "EF Core") .OrderByDescending(p => p.Preco);
... Where(p => p.Descricao == "EF Core")
WHERE Descricao = 'EF CORE'
p => p.Descricao == "EF Core" // BinaryExpression
Propriedade | O que é? |
---|---|
Left | Expression |
Right | Expression |
NodeType | Equal, AndAlso, ...... |
public class MeuVisitor : ExpressionVisitor { public override Expression Visit(Expression node) { // Identificar a expressão e montar o comando SQL return base.Visit(node); } }
public virtual Expression Process(Expression query) { query = new EnumerableToQueryableMethodConvertingExpressionVisitor().Visit(query); query = new QueryMetadataExtractingExpressionVisitor(_queryCompilationContext).Visit(query); query = new AllAnyToContainsRewritingExpressionVisitor().Visit(query); query = new GroupJoinFlatteningExpressionVisitor().Visit(query); query = new NullCheckRemovingExpressionVisitor().Visit(query); query = new EntityEqualityRewritingExpressionVisitor(_queryCompilationContext).Rewrite(query); query = new SubqueryMemberPushdownExpressionVisitor().Visit(query); query = new NavigationExpandingExpressionVisitor(...).Expand(query); query = new FunctionPreprocessingExpressionVisitor().Visit(query); new EnumerableVerifyingExpressionVisitor().Visit(query); return query; }
https://ralms.io
Twitter: @ralmsdeveloper