如何通过LINQ查询获取Entity-SQL命令文本?

时间:2012-02-10 17:44:21

标签: linq entity-framework code-first entity-sql

这是EF代码优先的练习。有一个简单的方法。我想获取对象服务生成的Entity SQL命令文本。

MyDbContext 派生自 DbContext Person 是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);
}

我曾经在LINQ to Entity中通过ObjectQuery.TraceString获取本机SQL命令文本。现在,我需要的是Entity-SQL语句, NOT 本机SQL语句。

但是,我无法将查询从IQueryable<Person>转换为ObjectQueryObjectQuery<Person>。 我试图通过反思获得DbQuery的成员。似乎DbQuery没有关于命令文本或跟踪字符串的任何属性。

由于

1 个答案:

答案 0 :(得分: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}