Si vous créez vos propres expressions et les compilez, ou si vous utilisez AsQueryable, alors oui; les méthodes générées par LINQ seront une douleur royale à déboguer.
Vous pouvez économiser de la douleur en utilisant de petites Fragements de réelles méthodes - au moins quelque chose d'utile montrera dans la trace de la pile ...
Une autre considération est: plutôt que d'avoir une expression énorme, si vous le pouvez daisy-chain les choses un peu plus vous pourriez avoir plus d'idée (de la trace de la pile) où il échoue. L'inconvénient est la performance - un où (foo) .Where (barre) est deux appels de délégué, où-comme Où (foo & & bar) peut être un.
Une option pourrait être d'échanger une version de débogage des méthodes d'extension; malheureusement, il est un peu gênant parce IQueryable<T>
et Queryable
sont dans le même espace ... cela fonctionne, mais ...
sortie première:
>Where: x => ((x % 2) = 0)
<Where: x => ((x % 2) = 0)
>Count
'WindowsFormsApplication2.vshost.exe' (Managed): Loaded 'Anonymously Hosted DynamicMethods Assembly'
<Count
code:
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 aux objets fait généralement référence aux méthodes de System.Linq.Enumerable. Ceux-ci n'impliquent pas de méthodes dynamiques (mais peuvent impliquer des méthodes anonymes). Utilisez-vous vraiment des méthodes dynamiques? –
@David - J'ai demandé la même chose; Orlangur utilise AsQueryable pour utiliser le même code avec plusieurs sources - donc des méthodes dynamiques sont attendues. –