使用 Linq to Entity 查找视图的基础表以创建聚合依赖关系

发布于 2024-12-15 04:01:36 字数 3086 浏览 0 评论 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 是两个表的联接一样,我想获取两个表的名称,最后

执行如下:

如果有 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中选择*;

我正在使用 Linq to Entity 将其用于 SqlCacheDependency。

当我对基础表进行硬编码时,它非常适合视图,但现在我希望代码自动检查基础表

并执行非查询,例如

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

并生成聚合依赖项。

任何帮助表示赞赏。

谢谢。

I have a function:

 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 can be a table, view or a procedure.

What i want is to find the underlying tables associated with a view or a procedure.

like if q is a join of tow tables i want to get the name of both the tables and finally

execute like:

If there are tw0 tables say A and B

Then i need to make Aggregate Dependency like:

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

then the query i want to execute is

select * from A;
select * from B;

This i am using for SqlCacheDependency using Linq to Entity.

It works well for views when i hardcode the underlying tables but now i want the code automatically check for the underlying tables

and execute nonquery like

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

and make aggregate dependencies.

Any help is appreciated.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

安人多梦 2024-12-22 04:01:36

您必须使用数据库级工具来查找您的视图或存储过程所依赖的数据库对象(但这也意味着您必须知道它们在数据库中的全名)。例如,SQL Server 提供sp_depends 系统存储过程来跟踪依赖关系。这可能非常复杂,因为依赖关系可以有多个级别(过程可以依赖于视图,视图可以依赖于另一个视图,等等)。

请注意,高级 EF 映射还允许将 SQL 直接写入 EDMX,在这种情况下,您必须解析 ToTraceString 来查找数据库对象。

You must use database level tools to find which database objects your views or stored procedures depends on (but it also means you must know their full names in the database). For example SQL server offers sp_depends system stored procedure to track dependencies. This can be quite complicated because dependencies can have multiple levels (procedure can be dependent on view, view can be dependent on another view, etc.).

Be aware that advanced EF mapping also allows writing SQL directly to EDMX and in such case you will have to parse ToTraceString to find database objects.

围归者 2024-12-22 04:01:36

我已经找到了我发布的问题的解决方案。

有一个查询对 sql server 2005 及更高版本有效。

我们需要传递对象的名称,它将返回它所依赖的表的名称

示例:

视图的名称是 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'

这篇文章是修改后的答案我在网站上发布的问题:

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

我更改的是添加行 B = 'USER_TABLE'

这意味着仅返回那些作为表的依赖项。

第二个东西添加了一个 WHERE 子句,以便找到特定的对象。

谢谢

I have found a solution for the problem i have posted.

There is a query that is valid for sql server 2005 onward.

We need to pass the name of the object and it will return us the name of the tables on which it depends

Example:

The name of the View is say 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'

This post is the modified answer of the question i have posted on the website:

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

What i changed is added the line where B = 'USER_TABLE'

Which means only those dependencies are returned who are tables.

And the seconds thing is added a WHERE clause so that a specific object is found.

Thanks

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文