ホームページ >データベース >mysql チュートリアル >インターセプターを使用して Entity Framework で Char(N) 値を自動的にトリミングする方法

インターセプターを使用して Entity Framework で Char(N) 値を自動的にトリミングする方法

Barbara Streisand
Barbara Streisandオリジナル
2024-12-29 13:32:10332ブラウズ

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

Entity Framework インターセプターを使用した Char(N) 値の自動トリミング

このシナリオでは、テキスト値が次のように格納されるという課題に直面しています。外部データベースの char(N) フィールドは、Entity Framework で取得するときに自動的にトリミングする必要がある(EF).

幸いなことに、EF 6.1 はインターセプターを使用したソリューションを提供します。 Microsoft の Entity Framework のプログラム マネージャーである Rowan Miller が説明したように、インターセプターを使用すると、モデル内の文字列プロパティから末尾の空白を自動的に削除できます。

このソリューションを実装するには、次の手順に従います。

  1. StringTrimmerInterceptor クラスを次のように定義します。以下:
// Omitted for brevity (see full code provided below)
  1. インターセプターを EF に登録するための MyConfiguration クラスを作成します:
// Omitted for brevity (see full code provided below)

このインターセプターと構成クラスをプロジェクトに追加します。 , EF は、char(N) フィールドから取得した文字列値を自動的にトリミングします。トリミングはデータベース内で行われ、最適なパフォーマンスが保証されます。

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());
        }
    }
}

以上がインターセプターを使用して Entity Framework で Char(N) 値を自動的にトリミングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。