2012-10-25 10 views
9

czytałem artykuł o Linq to Sql i natknąłem się na to:Czy istnieje api lub rozszerzenie do przetłumaczenia wyrażeń lambda IQueryable <T> na ciągi SQL?

IQueryProvider provider = new QueryProvider(database.GetCommand, database.ExecuteQuery); 
IQueryable<Product> source = new Queryable<Product>(provider, database.GetTable<Product>()); 
IQueryable<string> results = source.Where(product => product.CategoryID == 2) 
            .OrderBy(product => product.ProductName) 
            .Select(product => product.ProductName) 
            .Skip(5) 
            .Take(10); 

Następnie autor przetłumaczone wyniki w zwykły SQL:

exec sp_executesql N'SELECT [t1].[ProductName] 
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ProductName]) AS [ROW_NUMBER], [t0].[ProductName] 
FROM [dbo].[Products] AS [t0] 
WHERE [t0].[CategoryID] > @p0 
) AS [t1] 
WHERE [t1].[ROW_NUMBER] BETWEEN @p1 + 1 AND @p1 + @p2 
ORDER BY [t1].[ROW_NUMBER]',N'@p0 int,@p1 int,@p2 int',@p0=2,@p1=5,@p2=10 

I pomyślałem sobie: „świętą krowę wouldn” t byłoby wspaniale, gdyby istniało rozszerzenie do IQueryable, które generowałoby te ciągi dla ciebie podczas debugowania? "

Ktoś słyszał o czymś takim, a jeśli tak, czy mógłbyś wskazać mi właściwy kierunek?

Dzięki!

+2

http://msdn.microsoft.com/en-us/library/bb386961.aspx – Servy

+0

Informacje ogólne na temat ogólnych działań można znaleźć na stronie http://msdn.microsoft.com/en-us /library/bb399342.aspx – AakashM

Odpowiedz

4

Z Linq do Sql możesz zadzwonić pod numer query.Provider.ToString(), a to zwróci ci tekst zapytania (btw możesz oglądać tę samą właściwość w Visual Studio podczas debugowania).

AKTUALIZACJA: (złożona część) W jaki sposób jest realizowany?

Rzeczywiste generowanie ciągów jest wykonywane przez klasę System.Data.Linq.SqlClient.SqlProvider. Ma ukrytą metodę string IProvider.GetQueryText(Expression query), która buduje tekst zapytania SQL na podstawie przekazanego wyrażenia. Ta metoda jest ukryta przez wewnętrzny interfejs IProvider, więc nie jest to banalne.

+0

To wydaje się zbyt proste: p – Rawling

+0

@Rawling przepraszam, możemy to później komplikować :) –

2

Myślę, że Linqpad może być używany do tłumaczenia między SQL i Linq, mam nadzieję, że pomaga.

+0

jak zrobiłbyś to z linqpad? –

2

Można ustawić właściwość DataContext.Log Do TextWriter (np Console.Out), aby zobaczyć SQL gdyż jest generowany, ale nie sądzę, pozwala to wyjście SQL bez wykonywania go.

+3

Można również ustawić go na 'StringWriter', który zapisuje do' StringBuilder', lub ustawić, aby zapisywać bezpośrednio do pliku. Są to powszechne alternatywy dla konsoli. – Servy

+0

@Servy: +1 'StringWriter' jest jednym z tych rzadko używanych typów, które są idealne do wielu celów. – leppie

1

Straszna hacky rozwiązanie:

Zastosowanie DataContext.Log jak wcześniej powiedział, ale po prostu zawinąć wszystko w transakcji i wycofania. ; p

Powiązane problemy