Простой способ
Другой вариант, который намного проще, - добавить то, что вам нужно, с помощью Iterator
, см. Пример ниже.Недостатком этого подхода является то, что все было бы извлечено в память во время выполнения итерации, так что AppendData
выполняется только для возвращенных данных.Это похоже на параметр @Chris, но вы не обязаны создавать новый запрос Func
и Select
каждый раз, когда хотите использовать метод.
static void Main(string[] args)
{
var data = new List<int> { 1, 2, 3, 4, 5 }.AsQueryable().AppendData();
Console.WriteLine("Before execute");
Console.Write("{ ");
foreach (var x in data)
Console.Write("{0}, ", x);
Console.WriteLine( "}");
Console.WriteLine("After execute");
Console.Read();
}
// Append extra data. From this point on everything is in memory
// This should be generic, i.e. AppendData<T>, but I an easy way to "append"
static IEnumerable<int> AppendData(this IEnumerable<int> data)
{
Console.WriteLine("Adding");
foreach (var x in data)
yield return x * 2;
}
Трудный путь
Я не верю, что есть какие-то встроенные события, подобные этому, но вы, вероятно, могли бы добавить свое собственное, реализовав собственную оболочку IQueryable
.
Здесь представляет собой серию написанияполный IQueryable
провайдер, который также покажет вам, где вы можете разместить свою обертку, скорее всего около этого IQueryProvider
.
Удачи и надеюсь, что это поможет.