2010-09-02 38 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實例,並分別記錄它們。但更重要的是,你可能不應該將未經過濾的表格內容讀入內存!