سؤال

أنا أستخدم Linq إلى SQL.لدي DataContext الذي أستخدمه .SubmitChanges()'ing.حدث خطأ أثناء إدراج حقل الهوية، وأود أن أرى الاستعلام الذي يستخدمه لإدراج حقل الهوية هذا.

لا أرى الاستعلام نفسه داخل الساعة السريعة؛أين يمكنني العثور عليه من داخل المصحح؟

هل كانت مفيدة؟

المحلول

وهو في الواقع ثمة إجابة بسيطة جدا لسؤالك

وفقط لصق هذا في إطار المراقبة الخاص بك

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

نصائح أخرى

والكثير من الناس قد الكتابة الخاصة بهم "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()

وهذا ناتج كل شيء إرادة ذلك، ينق إلى SQL يقوم به في إطار التصحيح البصرية استوديو.

بالإضافة إلى إجابة بورتمان, ، إذا كنت تستخدم تطبيق وحدة تحكم، فالأمر بسيط مثل:

myDataContext.Log = Console.Out;

أو يمكنك استخدام شيء مثل Linq2SQL Profiler وهو أداة ممتازة إلى حد ما وهي في الواقع الأداة المناسبة للمهمة:

Linq to SQL Profiler - مصحح الأخطاء المرئي في الوقت الحقيقي لـ Linq إلى SQL

تشغيل SQL التعريف إذا كان لديك. سوف تظهر كل حركة المرور لقاعدة البيانات الخاصة بك، بما في ذلك نص الأمر SQL.

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();

وأوافق على أن LINQ إلى SQL التعريف هو الأداة المناسبة لهذه المهمة. ولكن إذا كنت لا تريد أن تنفق المال أو تحتاج فقط أن تفعل شيئا بسيطا، وأنا أحب نهج DebugTextWriter.

وبعد قراءة هذا السؤال ذهبت بعيدا تبحث عن شيء أكثر قوة. اتضح الحرس داميان أيضا <لأ href = "http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers "يختلط =" نوفولو "> كتب لطيفة جدا المقالة حول بناء الكتاب مختلفة للتعامل مع أشياء مختلفة مثل إخراج إلى الذاكرة، تصحيح، ملف، أبو ظبي متعددة، أو حتى باستخدام المندوبين بسيط.

وأنا أنهى باستخدام اثنين من أفكاره وكتابة 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);
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top