Как получить текст команды Entity-SQL по запросу LINQ?

Это упражнение 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);
}
</person>

Я использовал, чтобы получить собственный текст команды SQL ObjectQuery.TraceString в LINQ to Entity. Теперь мне нужен оператор Entity-SQL, а не собственный SQL-оператор.

Но я не могу IQueryable запрос из IQueryable в ObjectQuery или ObjectQuery. Я попытался получить членов DbQuery путем отражения. Похоже, что у DbQuery нет никакого свойства о тексте команды или строке трассировки.

благодаря

1 ответ

Мое предложение о том, что вы хотите, это использовать Dynamic Linq. Библиотека (часть образцов Linq) включает в себя множество расширений IQueryable, которые возвращают объекты Linq.DataQuery. Когда вы будете использовать 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>}
</cmsdevmapping.case>

Вы также можете проверить свой тип в цикле:

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

licensed under cc by-sa 3.0 with attribution.