Soru LINQ Tarafından Oluşturulan SQL deyimlerini nasıl görüntüleyebilirim?


ObjectQuery yöntemini kullanarak nasıl yapılır?


44
2018-02-04 15:53


Menşei




Cevaplar:


DataContext'inizin .Log özelliğine her zaman bir şeyler ekleyebilirsiniz. Bu, gönderilen tüm SQL komutlarını gösterecektir.

Bunu veri erişim nesneleri için temelimde yapıyorum ve Visual Studio hata ayıklama konsoluna çıktıyorum. Nesneler kendi DataContextlerini oluşturdukça, hata ayıklayıcısını kontrol edip, bunun gibi bir TextWritter yardımcı sınıfını eklediğimi kontrol ediyorum:

dbDataContext _dB = new dbDataContext();
_dB.CommandTimeout = 5000;

#if DEBUG
    _dB.Log = new DebugTextWriter();
#endif

Hata ayıklama konsoluna çıkış için yardımcı nesne İşte:

//utility class for output of TextWriter for the Visual Sudio Debug window
class DebugTextWriter : System.IO.TextWriter
{
    public override void Write(char[] buffer, int index, int count)
    {
        System.Diagnostics.Debug.Write(new String(buffer, index, count));
    }

    public override void Write(string value)
    {
        System.Diagnostics.Debug.Write(value);
    }

    public override Encoding Encoding
    {
        get { return System.Text.Encoding.Default; }
    }
}

52
2018-02-04 16:28



Kullananlar için Varlık Çerçevesi 6 Kontrol bu, umarım birisine yardım eder. - stom


ObjectQuery Yöntemi kullanarak bulduğum şey. Test için konsolu kullanarak aşağıdakileri yapabilirsiniz:

Aşağıdaki gibi bir Uzantı Yöntemi oluşturun, sonra arayın. Ürün ürünü deyin, ardından SQL ürün.ToTraceString olarak yazdırılır.

public static class MyExtensions
{
    public static string ToTraceString<T>(this IQueryable<T> t)
    {
        string sql = "";
        ObjectQuery<T> oqt = t as ObjectQuery<T>;
        if (oqt != null)
            sql = oqt.ToTraceString();
        return sql;
    }
}

23
2018-02-04 16:39



VS Watch penceresinde de kullanılabilir: ((ObjectQuery)myQuery).ToTraceString(). Güzel! - icebat
Ne gibi toplu yöntemler hakkında Count? - Mat J
Bu durumda, IQueryable <T> ObjectQuery <T> 'ye dönüştüremediğiniz dbContext kullanırken işe yaramaz. - NER1808


Kullanabilirsiniz LINQPad bunun için.


18
2018-02-04 15:56



ObjectQuery Metodu veya SQL Profiler'i kullandığını söylüyorlar. Örneğin bir konsolda nasıl programlanır? - nellbryant
En son soruyu anlayabildiğimden emin değilim ... En azından, başlığındaki soruyu cevaplamak için, "LINQ Oluşturulan SQL deyimlerini nasıl görüntüleyebilirim?": LINQPad "Sonuçlar" ı seçebileceğiniz bir çıktı penceresine sahiptir. Lambda "veya" SQL ". - Olav Haugen
Hey, bu açık kaynak kodlu bir araç! Teşekkür ederim. - nellbryant
LinqPad reccomendation için +1. Bu her. Net geliştiricinin temel araçlarının listesinde olmalıdır. - Doctor Jones
Bu sorunun cevabını aradığımda LinqPad'i kullanıyordum. Sonuçlar bölmesindeki 'SQL' düğmesini tamamen kaçırdım. Teşekkürler - Greg Woods


 var q = from img in context.Images
                    ...
         select img;
 string sql = q.ToString();

sql sql select sorgusunu içerecektir.

DÜZENLEME: dezavantaj: parametrelerinin şu anda hiçbir değeri olmayacak


16
2017-12-23 14:39



Yerel olarak hata ayıklıyorsanız ve SQL Server kullanıyorsanız, SQL Profiler'ı çalıştırın. Tüm parametrelerle sorgu orada görünecektir. - Rich


Bir göz atabilirsin. Linq-to-SQL Hata Ayıklama Görüntüleyicisiya da sadece farenizi Linq-to-SQL sorgunuzun üzerine getirin (araç ipucu, oluşturulan SQL'i göstermelidir) veya aşağıdakileri yapın:

context.GetCommand(query).CommandText

14
2018-02-04 16:16



Henüz GetCommand denemedim. Scott Gu’nın bağlantısını beğeniyorum! Bu Visualizer yerleşik Visual Studio 2010 mu? - nellbryant
@nellbryant: Hayır, hala VS galerisinden almanız gereken ayrı bir uzantı - marc_s


SQL Server Profiler'ı çalıştırabilirsiniz.


5
2018-05-31 15:57





Veritabanı içeriğini kurarken kullandığım şey budur:

this.DbContext.Database.Log += s => Debug.WriteLine(s);

1
2018-06-28 22:08





Sadece küçük bir güncellemeyle SQL'i kaydetmek için bir Eylem kullanabilirsiniz:

// test SQL logger
Action<string> SQLLogger = (message) => System.Diagnostics.Debug.Write(message);
_dB.Context().Database.Log = SQLLogger;

0
2017-09-20 10:04