Это старый вопрос, но я не вижу ни одного упоминания о "хаке", который позволяет вызывать методы во время выбора без повторения. Идея состоит в том, чтобы использовать конструктор, и в конструкторе вы можете вызывать все, что пожелаете (по крайней мере, он прекрасно работает в LINQ с NHibernate, не уверен насчет LINQ2SQL или EF, но я думаю, что это должно быть так же).
Ниже у меня есть исходный код для тестовой программы, похоже, что повторяющийся подход в моем случае примерно в два раза медленнее подхода конструктора, и я думаю, что это неудивительно - моя бизнес-логика была минимальной, поэтому такие вещи, как итерация и распределение памяти, имеют значение.
Также хотелось бы, чтобы был лучший способ сказать, что то или иное не следует пытаться выполнить в базе данных,
// Here are the results of selecting sum of 1 million ints on my machine:
// Name Iterations Percent
// reiterate 294 53.3575317604356%
// constructor 551 100%
public class A
{
public A()
{
}
public A(int b, int c)
{
Result = Sum(b, c);
}
public int Result { get; set; }
public static int Sum(int source1, int source2)
{
return source1 + source2;
}
}
class Program
{
static void Main(string[] args)
{
var range = Enumerable.Range(1, 1000000).ToList();
BenchmarkIt.Benchmark.This("reiterate", () =>
{
var tst = range
.Select(x => new { b = x, c = x })
.AsEnumerable()
.Select(x => new A
{
Result = A.Sum(x.b, x.c)
})
.ToList();
})
.Against.This("constructor", () =>
{
var tst = range
.Select(x => new A(x, x))
.ToList();
})
.For(60)
.Seconds()
.PrintComparison();
Console.ReadKey();
}
}