【问题标题】:SQL generated by LINQ for loggingLINQ 生成的用于日志记录的 SQL
【发布时间】:2010-09-02 19:39:46
【问题描述】:

我有这个查询,它的结果实现了IEnumerable

RoutesEntities routesModel = new RoutesEntities();
LocalesEntities localesModel = new LocalesEntities();

var routesQuery = from rs in routesModel.Routes.ToList()
                  join ls in localesModel.Locales.ToList() 
                  on rs.LocaleID equals ls.LocaleID
                  select new
                  {
                      LocaleID = rs.LocaleID,
                      RouteName = rs.RouteName
                  };

问题:如何从这个查询中得到生成的SQL,或者如何将其类型转换为ObjectQuery以使用routesQuery.ToTraceString()?有可能吗?

原因:我想将所有 SQL 查询记录到 DB,但我不想为连接的上下文(表)创建新对象

重要提示:我最初不能使用ObjectQuery,因为毕竟我使用了

ListView.DataSource = routesQuery;
ListView.DataBind() 

对于一个数据源使用不同的上下文(数据库表)可能会导致错误。

那么我应该怎么做才能得到生成的 SQL 查询呢?

提前致谢。

【问题讨论】:

    标签: asp.net sql linq entity-framework datasource


    【解决方案1】:
    var routesQuery = from rs in routesModel.Routes.ToList() 
                      join ls in localesModel.Locales.ToList()  
    

    您设置此查询的方式是将整个 Routes 表加载到内存中,并将整个 Locales 表加载到内存中。您的查询(有两个),看起来都像:

    select fieldlist
    from tablename
    

    您应该将这两个查询分成单独的 ObjectQuery 实例,并分别记录它们。但更重要的是,您可能不应该将未过滤的表格内容读入内存!

    【讨论】:

      【解决方案2】:

      您将针对两个不同的数据上下文,因此您将在每个数据上下文上运行不同的查询并将结果连接到客户端。对于 LINQ-to-SQL 上下文,可以按照 Femaref 已经指出的那样记录数据库中的查询。 EF ObjectContext 仍有工作要赶上 LINQ-to-SQL 并且不提供日志记录。但是 ObjectQuery.CommandText 确实返回查询文本。无法记录客户端中的加入,因为......它不存在。它不是 SQL 查询,是 LINQ-to-Objects 循环。

      【讨论】:

        【解决方案3】:

        有答案:

        http://arteinvolo.org.ua/2010/09/21/how-to-use-entity-framework-with-multiple-entities/

        public static EntityConnection setSchema(string[] edmxFiles) 
        {
                    XNamespace edmxns = "http://schemas.microsoft.com/ado/2007/06/edmx";
                    XNamespace edmns = "http://schemas.microsoft.com/ado/2006/04/edm";
                    XmlDocument edmxXml = new XmlDocument();
                    XmlNamespaceManager nameSpace = new XmlNamespaceManager(edmxXml.NameTable);
        
                    List<XmlReader> ssdlReader = new List<XmlReader>();
                    List<XmlReader> csdlReader = new List<XmlReader>();
                    List<XmlReader> mslReader = new List<XmlReader>();
        
                    foreach (string edmxFile in edmxFiles)
                    {
                        edmxXml.Load(edmxFile);
                        nameSpace.AddNamespace("edmx", edmxns.NamespaceName);
        
                        XmlNode ssdlNode = edmxXml.SelectSingleNode("//edmx:StorageModels", nameSpace);
                        XmlNode csdlNode = edmxXml.SelectSingleNode("//edmx:ConceptualModels", nameSpace);
                        XmlNode mslNode = edmxXml.SelectSingleNode("//edmx:Mappings", nameSpace);
        
                        ssdlReader.Add(XmlReader.Create(new StringReader(ssdlNode.InnerXml)));
                        csdlReader.Add(XmlReader.Create(new StringReader(csdlNode.InnerXml)));
                        mslReader.Add(XmlReader.Create(new StringReader(mslNode.InnerXml)));
                    }
        
                    StoreItemCollection storageCollection = new StoreItemCollection(ssdlReader);
                    EdmItemCollection edmCollection = new EdmItemCollection(csdlReader);
                    StorageMappingItemCollection mappingCollection = new StorageMappingItemCollection(edmCollection, storageCollection, mslReader);
        
                    MetadataWorkspace workSpace = new MetadataWorkspace();
                    workSpace.RegisterItemCollection(storageCollection);
                    workSpace.RegisterItemCollection(edmCollection);
                    workSpace.RegisterItemCollection(mappingCollection);
        
                    SqlConnection metaConnect = new SqlConnection(ConfigurationManager.ConnectionStrings["CustomSqlConnection"].ToString());
                    EntityConnection entityConnect = new EntityConnection(workSpace, metaConnect);
        
                    return entityConnect;
        }
        

        如何使用:

        EntityConnection entityConnection = Connector.setSchema(new string[] {
                        Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "/App_Model/RoutesModel.edmx"),
                        Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "/App_Model/LocalesModel.edmx")
        });
        
        entityConnection.Open();
        String queryData = "SELECT rs.RouteID, rs.RouteURL, ls.LocaleName, ls.IsActive, ls.LocaleDescription FROM RoutesEntities.Routes AS rs INNER JOIN LocalesEntities.Locales AS ls ON ls.LocaleID = rs.LocaleID";
        EntityCommand queryCommand = new EntityCommand(queryData, entityConnection);
        DbDataReader routesReader = queryCommand.ExecuteReader(CommandBehavior.SequentialAccess);
        
        ListView.DataSource = routesReader;
        ListView.DataBind();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-26
          • 1970-01-01
          • 1970-01-01
          • 2012-03-28
          • 2014-06-16
          • 2021-03-25
          • 2019-02-20
          • 1970-01-01
          相关资源
          最近更新 更多