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