2010-09-02 48 views
2

我有这个查询,其结果实现IEnumerable由LINQ生成的SQL记录

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查询数据库,但我不希望创建上下文加入新的对象(表)

重要:我不能使用ObjectQuery最初是因为毕竟我用

ListView.DataSource = routesQuery; 
ListView.DataBind() 

而且它可以导致一个数据源使用不同的上下文(数据库表)的错误。

那么我该怎么做才能生成SQL查询?

在此先感谢。

回答

0

就有答案了:

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

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

1
var routesQuery = from rs in routesModel.Routes.ToList() 
        join ls in localesModel.Locales.ToList() 

设置此查询的方式是将整个路由表加载到内存中,并将整个语言环境表加载到内存中。你的查询(有两个),这两个看起来像:

select fieldlist 
from tablename 

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