0

私は機能を持っています:

 public static List<T> EntityCache<T>(this System.Linq.IQueryable<T> q, ObjectContext dc, string CacheId)
    {


        try
        {
            List<T> objCache = (List<T>)System.Web.HttpRuntime.Cache.Get(CacheId);

            string connStr = (dc.Connection as System.Data.EntityClient.EntityConnection).StoreConnection.ConnectionString;

            if (objCache == null)
            {
                ObjectQuery<T> productQuery = q as ObjectQuery<T>;

                string sqlCmd = productQuery.ToTraceString();

                using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connStr))
                {
                    conn.Open();
                    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sqlCmd, conn))
                    {

                        string NotificationTable = q.ElementType.Name;
                        System.Web.Caching.SqlCacheDependency sqldep = new System.Web.Caching.SqlCacheDependency(cmd);
                        cmd.ExecuteNonQuery();
                        objCache = q.ToList();
                        System.Web.HttpRuntime.Cache.Insert(CacheId, objCache, sqldep);
                    }
                }
            }

            return objCache;

        }
        catch (Exception ex)
        {
            throw ex;
        }

    }

qは、テーブル、ビュー、またはプロシージャにすることができます。

私が欲しいのは、ビューまたはプロシージャに関連付けられている基になるテーブルを見つけることです。

qが2つのテーブルの結合である場合のように、両方のテーブルの名前を取得し、最後に

次のように実行します。

tw0テーブルがある場合は、AとBと言います

次に、次のような集計依存関係を作成する必要があります。

  string sqlCmd1 = string.Empty;
                        string sqlCmd2 = string.Empty;

                        using (testEntities ctx1 = new testEntities())
                        {
                            sqlCmd1 = ((System.Data.Objects.ObjectQuery)(from p in ctx1.A select p)).ToTraceString();
                            sqlCmd2 = ((System.Data.Objects.ObjectQuery)(from p in ctx1.B select p)).ToTraceString();
                        }

                        System.Data.SqlClient.SqlCommand cmd1 = new System.Data.SqlClient.SqlCommand(sqlCmd1, conn);
                        System.Data.SqlClient.SqlCommand cmd2 = new System.Data.SqlClient.SqlCommand(sqlCmd2, conn);


 System.Web.Caching.SqlCacheDependency
                       dep1 = new System.Web.Caching.SqlCacheDependency(cmd1),
                       dep2 = new System.Web.Caching.SqlCacheDependency(cmd2);

                        System.Web.Caching.AggregateCacheDependency aggDep = new System.Web.Caching.AggregateCacheDependency();
                        aggDep.Add(dep1, dep2);

                        cmd1.ExecuteNonQuery();
                        cmd2.ExecuteNonQuery();

次に、実行したいクエリは

Aから*を選択します。Bから*を選択します。

これは、LinqtoEntityを使用してSqlCacheDependencyに使用しています。

基になるテーブルをハードコーディングするとビューに適していますが、コードが基になるテーブルを自動的にチェックするようになりました

のような非クエリを実行します

   cmd1.ExecuteNonQuery();
   cmd2.ExecuteNonQuery();

集約された依存関係を作成します。

どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

1

データベースレベルのツールを使用して、ビューまたはストアドプロシージャが依存しているデータベースオブジェクトを見つける必要があります(ただし、データベース内のフルネームを知っている必要もあります)。たとえば、SQLサーバーは、sp_depends依存関係を追跡するためのシステムストアドプロシージャを提供します。依存関係には複数のレベルがある可能性があるため、これは非常に複雑になる可能性があります(手順はビューに依存する可能性があり、ビューは別のビューに依存する可能性があります)。

高度なEFマッピングでは、SQLをEDMXに直接書き込むこともできます。そのような場合、ToTraceStringデータベースオブジェクトを見つけるために解析する必要があります。

于 2011-11-14T13:51:23.640 に答える
0

投稿した問題の解決策を見つけました。

SQLServer2005以降で有効なクエリがあります。

オブジェクトの名前を渡す必要があります。オブジェクトが依存するテーブルの名前が返されます。

例:

ビューの名前はAllProducts_Active_Inactiveと言います

                 ;WITH CTE AS (SELECT   o.name
            ,       o.type_desc 
            ,       p.name
            ,       p.type_desc as B
            ,       p.object_id
            FROM    sys.sql_dependencies d
                    INNER JOIN sys.objects o
                    ON d.object_id = o.object_id
                    INNER JOIN sys.objects p
                    ON d.referenced_major_id = p.object_id

                    where o.name = 'AllProducts_Active_Inactive'

            UNION ALL
            SELECT  o.name
            ,       o.type_desc 
            ,       p.name
            ,       p.type_desc as B
            ,       p.[object_id]
            FROM    sys.sql_dependencies d
                    INNER JOIN CTE o
                    ON d.object_id = o.object_id
                    INNER JOIN sys.objects p
                    ON d.referenced_major_id = p.object_id

                    where o.name = 'AllProducts_Active_Inactive'

                   ) 
            SELECT DISTINCT * FROM [CTE]
            where B = 'USER_TABLE'

この投稿は、私がWebサイトに投稿した質問の修正された回答です。

http://ask.sqlservercentral.com/questions/81318/find-the-underlying-tables-assocaited-with-a-view-or-a-stored-procedure-in-sql-server

私が変更したのは、B='USER_TABLE'の行を追加したものです。

つまり、テーブルである依存関係のみが返されます。

そして、特定のオブジェクトが見つかるように、秒単位にWHERE句が追加されます。

ありがとう

于 2011-11-17T14:49:10.937 に答える