Jeśli tworzysz własne wyrażenia i kompilujesz je lub używasz AsQueryable, to tak; metody generowane przez LINQ będą królewskim problemem do debugowania.
Można zaoszczędzić trochę bólu za pomocą małych fragements z rzeczywistych metod - przynajmniej coś pożytecznego pokaże w ślad stosu ...
Innym zjawiskiem jest: zamiast jednego ogromną ekspresją, jeśli potrafisz niweluj coś w łańcuchu, aby uzyskać więcej pomysłów (z wykresu stosu), w których nie działa. Minusem jest wydajność - a Gdzie (foo) .W przypadku (bar) jest dwa razy wywoływane przez delegata, gdzie - jako Gdzie (foo & & bar) może być jeden.
Jedną opcją może być zamiana wersji debugowania metod rozszerzeń; niestety jest to trochę niewygodne, ponieważ IQueryable<T>
i Queryable
są w tej samej przestrzeni nazw ... to działa, chociaż ...
Wyjście pierwsze:
>Where: x => ((x % 2) = 0)
<Where: x => ((x % 2) = 0)
>Count
'WindowsFormsApplication2.vshost.exe' (Managed): Loaded 'Anonymously Hosted DynamicMethods Assembly'
<Count
Kod:
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;
}
}
}
}
Linq do obiektów zwykle odnosi się do metod System.Linq.Enumerable. Nie obejmują one metod dynamicznych (ale mogą obejmować metody anonimowe). Czy naprawdę używasz metod dynamicznych? –
@ David - pytałem to samo; Orlangur używa AsQueryable do używania tego samego kodu z wieloma źródłami - więc oczekuje się metod dynamicznych. –