首頁 >資料庫 >mysql教程 >如何使用攔截器自動修剪實體框架中的 Char(N) 值?

如何使用攔截器自動修剪實體框架中的 Char(N) 值?

Barbara Streisand
Barbara Streisand原創
2024-12-29 13:32:10327瀏覽

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

使用實體框架攔截器自動修剪Char(N) 值

在這種情況下,您遇到了一個挑戰,其中文本值儲存為在實體框架中檢索時,外部資料庫中的char(N) 欄位需要自動修剪(EF)。

幸運的是,EF 6.1 提供了使用攔截器的解決方案。正如 Microsoft 實體框架專案經理 Rowan Miller 所解釋的,攔截器可用於自動修剪模型中字串屬性中的尾隨空格。

要實作此解決方案,請依照下列步驟操作:

  1. 將 StringTrimmerInterceptor類別定義為如下:
// Omitted for brevity (see full code provided below)
  1. 建立一個MyConfiguration類別來向EF註冊攔截器:
// 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());
        }
    }
}

以上是如何使用攔截器自動修剪實體框架中的 Char(N) 值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn