Maison >base de données >tutoriel mysql >Comment réduire automatiquement les valeurs Char(N) dans Entity Framework à l'aide d'intercepteurs ?

Comment réduire automatiquement les valeurs Char(N) dans Entity Framework à l'aide d'intercepteurs ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-29 13:32:10332parcourir

How to Automatically Trim Char(N) Values in Entity Framework Using Interceptors?

Découpage automatique des valeurs Char(N) avec les intercepteurs Entity Framework

Dans ce scénario, vous rencontrez un défi où les valeurs de texte stockées sous forme Les champs char(N) dans une base de données externe doivent être automatiquement coupés lorsqu'ils sont récupérés dans Entity Framework (EF).

Heureusement, EF 6.1 fournit une solution utilisant des intercepteurs. Comme l'explique Rowan Miller, responsable de programme pour Entity Framework chez Microsoft, les intercepteurs peuvent être utilisés pour supprimer automatiquement les espaces blancs de fin des propriétés de chaîne dans vos modèles.

Pour mettre en œuvre cette solution, suivez ces étapes :

  1. Définissez une classe StringTrimmerInterceptor comme suit :
// Omitted for brevity (see full code provided below)
  1. Créez un Classe MyConfiguration pour enregistrer l'intercepteur avec EF :
// Omitted for brevity (see full code provided below)

En ajoutant cet intercepteur et cette classe de configuration à votre projet, EF supprimera automatiquement les valeurs de chaîne extraites des champs char(N). Le découpage aura lieu dans la base de données, garantissant des performances optimales.

using System.Data.Entity.Core.Common.CommandTrees;
using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder;
using System.Data.Entity.Core.Metadata.Edm;
using System.Data.Entity.Infrastructure.Interception;
using System.Linq;

namespace FixedLengthDemo
{
    public class StringTrimmerInterceptor : IDbCommandTreeInterceptor
    {
        public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext)
        {
            if (interceptionContext.OriginalResult.DataSpace == DataSpace.SSpace)
            {
                var queryCommand = interceptionContext.Result as DbQueryCommandTree;
                if (queryCommand != null)
                {
                    var newQuery = queryCommand.Query.Accept(new StringTrimmerQueryVisitor());
                    interceptionContext.Result = new DbQueryCommandTree(
                        queryCommand.MetadataWorkspace,
                        queryCommand.DataSpace,
                        newQuery);
                }
            }
        }

        private class StringTrimmerQueryVisitor : DefaultExpressionVisitor
        {
            private static readonly string[] _typesToTrim = { "nvarchar", "varchar", "char", "nchar" };

            public override DbExpression Visit(DbNewInstanceExpression expression)
            {
                var arguments = expression.Arguments.Select(a =>
                {
                    var propertyArg = a as DbPropertyExpression;
                    if (propertyArg != null && _typesToTrim.Contains(propertyArg.Property.TypeUsage.EdmType.Name))
                    {
                        return EdmFunctions.Trim(a);
                    }

                    return a;
                });

                return DbExpressionBuilder.New(expression.ResultType, arguments);
            }
        }
    }
}

using System.Data.Entity;

namespace FixedLengthDemo
{
    public class MyConfiguration : DbConfiguration
    {
        public MyConfiguration()
        {
            AddInterceptor(new StringTrimmerInterceptor());
        }
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn