2012-02-10 57 views
0

這是EF代碼優先的練習。有一個簡單的方法。我想獲得由對象服務生成的實體SQL命令文本。如何通過LINQ查詢獲取Entity-SQL命令文本?

MyDbContext派生形式的DbContext是POCO類)。

using (MyDbContext context = new MyDbContext()) 
{ 
    var query = context.Set<Person>().FirstOrDefault(p => p.Age == 1); 
    Console.WriteLine(query.Name); 


    var objquery = query as ObjectQuery; 
    if (objquery != null) 
     Console.WriteLine(objquery.CommandText); 
} 

我使用ObjectQuery.TraceString在LINQ獲得本地SQL命令文本實體。現在,我需要的是Entity-SQL語句,不是原生SQL語句。

但是,我無法將查詢從IQueryable<Person>轉換爲ObjectQueryObjectQuery<Person>。 我試圖通過反思得到DbQuery的成員。看起來DbQuery沒有關於命令文本或跟蹤字符串的任何屬性。

謝謝

回答

1

我對你想要什麼的建議是使用Dynamic Linq。該庫(Linq Samples的一部分)包含許多返回Linq.DataQuery對象的IQueryable擴展。一旦你使用了DataQuery,你將擁有預期的對象。

var testQuery = 
    db.Cases. 
    Where("KeyID > 1"). 
    Take(1); 

foreach (var r in testQuery) 
{ 
    Console.WriteLine(r); 
} 

然後,您可以檢查您的查詢。

testQuery.Expression 
testQuery.Provider 

這些會給你:

{Table(Case).Where(=> (.Keyid > 1)).Take(1)} 
System.Linq.Expressions.Expression {System.Linq.Expressions.MethodCallExpression} 

- 和 -

{SELECT TOP (1) [t0].[Keyid], [t0].[FileNo], [t0].[MatterType], [t0].[LoanNo], [t0].[Investor], [t0].[LoanType], [t0].[Client], [t0].[ClientFileNo], [t0].[ClientStatus], [t0].[Mortgagor], [t0].[County], [t0].[PropertyStreet1], [t0].[PropertyStreet2], [t0].[PropertyCity], [t0].[PropertyState], [t0].[PropertyZipcode], [t0].[Status], [t0].[BoxNo], [t0].[InsurerLoanno], [t0].[InvestorLoanno], [t0].[insurer_name_id], [t0].[OldSystemKey], [t0].[FinalBilling], [t0].[HoldBilling], [t0].[LastModified], [t0].[PiggyLoanNo], [t0].[CurrComentID], [t0].[LockEFILE], [t0].[MSJAmount], [t0].[Created], [t0].[Locked], [t0].[FinalBillingDate], [t0].[HoldBillingDate], [t0].[CreatedBy], [t0].[Stage], [t0].[PriorStage], [t0].[DefendantUpdated], [t0].[VestingCode], [t0].[FileSource], [t0].[SubVestingCode], [t0].[AttorneyAssigment], [t0].[VoluntarySurrender], [t0].[FNMARisk], [t0].[Source], [t0].[REO_ID], [t0].[WTI_ID], [t0].[CaseDismissed], [t0].[REO_CompanyID], [t0].[SubMattertype], [t0].[VendorCode], [t0].[SubType] 
FROM [dbo].[Cases] AS [t0] 
WHERE [t0].[Keyid] > @p0} 
System.Linq.IQueryProvider {System.Data.Linq.DataQuery<CMSDEVMapping.Case>} 

您也可以驗證您在循環型:

r.GetType() {Name = "Case" FullName = "CMSDEVMapping.Case"} System.Type {System.RuntimeType} 
+0

得到它。現在我想我應該用查詢生成器方法編寫查詢。謝謝。 – Abbey 2012-02-11 05:44:12

+0

我認爲上面的SQL語句是原生SQL。我會嘗試另一種方式。 – Abbey 2012-02-11 06:11:53