Asp.net LINQ为日志记录生成的SQL

Asp.net LINQ为日志记录生成的SQL,asp.net,sql,linq,entity-framework,datasource,Asp.net,Sql,Linq,Entity Framework,Datasource,我有这个查询,它的结果实现了IEnumerable RoutesEntities routesModel = new RoutesEntities(); LocalesEntities localesModel = new LocalesEntities(); var routesQuery = from rs in routesModel.Routes.ToList() join ls in localesModel.Locales.ToList()

我有这个查询,它的结果实现了
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() 
而且它可能会导致一个数据源使用不同的上下文(DB表)时出错

那么,我应该如何获得生成的SQL查询呢


提前感谢。

您使用两种不同的数据上下文,因此您将对每种数据上下文运行不同的查询,并将结果加入客户端。对于LINQ到SQL上下文,数据库中的查询可以记录为Femaref已经指出的内容。EF仍然需要努力赶上LINQtoSQL,并且不提供日志记录。但是,不会返回查询文本。无法记录客户端中的加入,因为。。。它不存在。它不是SQL查询,而是LINQ到对象的循环

var routesQuery = from rs in routesModel.Routes.ToList() 
                  join ls in localesModel.Locales.ToList()  
设置此查询的方式是将整个Routes表加载到内存中,并将整个Locales表加载到内存中。您的查询(有两个)如下所示:

select fieldlist
from tablename
您应该将这两个查询分离为单独的ObjectQuery实例,并分别记录它们。但除此之外,您可能不应该将表中未过滤的内容读入内存

答案是:

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