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
Libérer: 2024-12-29 13:32:10
original
359 Les gens l'ont consulté

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)
Copier après la connexion
Copier après la connexion
  1. Créez un Classe MyConfiguration pour enregistrer l'intercepteur avec EF :
// Omitted for brevity (see full code provided below)
Copier après la connexion
Copier après la connexion

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());
        }
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal