2008-10-29 80 views
5

我們在我們的系統中使用非常廣泛的LINQ。特別是LINQ到對象。所以在一些地方,我們最終在內存中創建了一些LINQ查詢,這些查詢是由一些巨大的表達式構建的問題出現在表達式中有一些錯誤時。所以我們得到NullReferenceException,並且堆棧跟蹤將我們引向無處([輕量級函數])。在由LINQ生成的動態方法內拋出異常。調試.NET動態方法

有沒有簡單的方法來調試這種動態方法?還是我必須犧牲自己學習WinDBG? :-)

+0

Linq對象通常是指System.Linq.Enumerable的方法。這些不涉及動態方法(但可能涉及匿名方法)。你真的在使用動態方法嗎? – 2008-10-29 21:04:03

+0

@大衛 - 我問過同樣的; Orlangur正在使用AsQueryable在多個源代碼中使用相同的代碼 - 因此需要動態方法。 – 2008-10-29 21:38:23

回答

3

如果你正在構建自己的表達式並編譯它們,或者使用AsQueryable,那麼是的; LINQ生成的方法將成爲調試的王室痛苦。

可以使用的實際方法小fragements節省一些痛苦 - 至少一些有用的東西將在堆棧跟蹤顯示...

另一個考慮因素是:而不是一個巨大的表現,如果你能雛菊鏈的東西多一點,你可能有更多的想法(從堆棧跟蹤),它失敗的地方。缺點是性能 - 一個Where(foo).Where(bar)是兩個代表調用,其中 - 作爲Where(foo & &酒吧)可以是一個。

一個選項可能是交換調試版本的擴展方法;不幸的是它是一個有點不方便,因爲IQueryable<T>Queryable都在同一個命名空間......這個作品,雖然...

輸出第一:

>Where: x => ((x % 2) = 0) 
<Where: x => ((x % 2) = 0) 
>Count 
'WindowsFormsApplication2.vshost.exe' (Managed): Loaded 'Anonymously Hosted DynamicMethods Assembly' 
<Count 

代碼:

using System; 
using System.Diagnostics; 
using System.Linq.Expressions; 

namespace Demo 
{ 
    using DebugLinq; 
    static class Program 
    { 
     static void Main() 
     { 
      var data = System.Linq.Queryable.AsQueryable(new[] { 1, 2, 3, 4, 5 }); 
      data.Where(x => x % 2 == 0).Count(); 
     } 
    } 
} 
namespace DebugLinq 
{ 
    public static class DebugQueryable 
    { 
     public static int Count<T>(this System.Linq.IQueryable<T> source) 
     { 
      return Wrap(() => System.Linq.Queryable.Count(source), "Count"); 
     } 

     public static System.Linq.IQueryable<T> Where<T>(this System.Linq.IQueryable<T> source, Expression<Func<T, bool>> predicate) 
     { 
      return Wrap(() => System.Linq.Queryable.Where(source, predicate), "Where: " + predicate); 
     } 
     static TResult Wrap<TResult>(Func<TResult> func, string caption) 
     { 
      Debug.WriteLine(">" + caption); 
      try 
      { 
       TResult result = func(); 
       Debug.WriteLine("<" + caption); 
       return result; 
      } 
      catch 
      { 
       Debug.WriteLine("!" + caption); 
       throw; 
      } 
     } 
    } 
} 
1

如果你使用LINQ to Objects,我不希望看到動態方法被創建。我希望他們與LINQ to SQL等。你能舉一個例子,你看到這個?

當談到LINQ時,我並沒有什麼好的調試技巧,但我很肯定MS知道這是一個痛點。我可以建議你試試VS2010 CTP,看看這樣更好嗎?誠然,爲了改善VS而不是解決你的直接問題。

+0

由LINQ到對象我的意思是通過AsQueryable() – 2008-10-29 08:41:34