2009-03-12 2 views
13

Я использую Linq для SQL. У меня есть DataContext, против которого я являюсь .SubmitChanges() 'ing. Ошибка вставки поля идентификации, и я хотел бы, чтобы этот запрос использовался, чтобы вставить это поле идентификации.Как получить запрос TSQL из LINQ DataContext.SubmitChanges()

Я не вижу самого запроса в рамках быстрого просмотра; где я могу найти его из отладчика?

+0

Вы также можете настроить DataContext для вывода запросов в файл , – eglasius

ответ

8

Существует на самом деле очень простой ответ на ваш вопрос

Просто вставьте это в окне просмотра

((System.Data.Objects.ObjectQuery)myLinqQueryVar).ToTraceString() 
+0

К сожалению, это не всегда работает. Для exaple il у вашего запроса есть groupby ... – bobzer

+0

вы уверены, что попробовали его для linqtosql? –

+0

Ответ зависит от большой части вашей сущности Framework от версии 4.1, у вас есть dbcontext, который реализует context.Log, поэтому вы можете использовать решение, которое вы видите ниже, но до этого, если вы используете контекст из объекта objectcontext, вы должны иметь отношение к решению выше за исключением того, что это неудобно, это не всегда полезно – bobzer

3

Запустите SQL Profiler, если он у вас есть. Он покажет весь трафик вашей базы данных, включая текст команды SQL.

+0

Спасибо; это работает. Тем не менее, я надеялся увидеть это от VS. – tsilb

+0

SQL Profiler удобен и по другим причинам, например: просмотр загрузки вашего кода на БД. – geofftnz

20

Многие люди писали свои собственные «DebugWriter» и прикрепив ее так:

// Add this class somewhere in your project... 
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; } 
    } 
} 

// Then attach it to the Log property of your DataContext... 
myDataContext.Log = new DebugTextWriter() 

Это будет выводить все, что Linq к-Sql делает в окно отладки в Visual Studio.

11

В дополнение к Portman's answer, если вы консольное приложение, это так просто, как:

myDataContext.Log = Console.Out; 

Или вы могли бы использовать что-то вроде Linq2SQL Profiler, который является довольно отличным инструментом и на самом деле правильный инструмент для работы :

Linq to SQL Profiler - Real-time visual debugger for Linq to SQL

0

Я согласен с тем, что Linq to SQL Profiler является правильным инструментом для этой работы. Но если вы не хотите тратить деньги или просто нужно сделать что-то простое, мне нравится подход DebugTextWriter.

После прочтения этого вопроса я отправился на поиски чего-то более крепкого. Оказывается, Damien Guard также wrote a very nice article о создании разных писателей для решения различных задач, таких как вывод в память, отладка, файл, несколько мест назначения или даже использование простых делегатов.

я завелся, используя пару своих идей и писать ActionTextWriter, который может обрабатывать более одного делегата, и я думал, что я разделю его здесь:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 

namespace Writers 
{ 
    public class ActionTextWriter : TextWriter 
    { 
     protected readonly List<Action<string>> Actions = new List<Action<string>>(); 

     public ActionTextWriter(Action<string> action) 
     { 
      Actions.Add(action); 
     } 

     public ActionTextWriter(IEnumerable<Action<string>> actions) 
     { 
      Actions.AddRange(actions); 
     } 

     public ActionTextWriter(params Action<string>[] actions) 
     { 
      Actions.AddRange(actions); 
     } 

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

     public override void Write(char[] buffer, int index, int count) 
     { 
      Write(new string(buffer, index, count)); 
     } 

     public override void Write(char value) 
     { 
      Write(value.ToString()); 
     } 

     public override void Write(string value) 
     { 
      if (value == null) 
      { 
       return; 
      } 

      foreach (var action in Actions) 
      { 
       action.Invoke(value); 
      } 
     } 
    } 
} 

Вы можете добавить столько действий, как вам нравится , Этот пример записывает в лог-файл и консоли в Visual Studio через Debug.Write:

// Create data context 
var fooDc = new FooDataContext(); 

// Create writer for log file. 
var sw = new StreamWriter(@"C:\DataContext.log") {AutoFlush = true}; 

// Create write actions. 
Action<string> writeToDebug = s => Debug.Write(s); 
Action<string> writeToLog = s => sw.Write(s); 

// Wire up log writers. 
fooDc.Log = new ActionTextWriter(writeToDebug, writeToLog); 

И, конечно, если вы хотите сделать более простые в использовании экспромтом, вы всегда можете продлить ActionTextWriter .. писать общий подход и повторное использование, не так ли?

using System.Diagnostics; 
using System.IO; 

namespace Writers 
{ 
    public class TraceTextWriter : ActionTextWriter 
    { 
     public TraceTextWriter() 
     { 
      Actions.Add(s => Trace.Write(s)); 
     } 
    } 

    public class FileTextWriter : ActionTextWriter 
    { 
     public FileTextWriter(string path, bool append = false) 
     { 
      var sw = new StreamWriter(path, append) {AutoFlush = true}; 
      Actions.Add(sw.Write); 
     } 
    } 
} 
1
FooDataContext dc = new FooDataContext(); 

StringBuilder sb = new StringBuilder(); 
dc.Log = new StringWriter(sb); 

var result=from r in dc.Tables select d; 

..... 
string query=sb.ToString(); 
Смежные вопросы