Первое (успешное) использование - это выражение, которое драйвер монго может просмотреть во время выполнения, чтобы узнать, что ID = lib.ID. В частности, здесь NewExpression .
например. Visual Studio допускает визуализацию выражений в отладчике, и для первого она показывает:
.Lambda #Lambda1<System.Func`2[ConsoleApp1.Program+MyOriginalClass,ConsoleApp1.Program+MyProjectedClass]>(ConsoleApp1.Program+MyOriginalClass $lib)
{
.New ConsoleApp1.Program+MyProjectedClass(){
ID = $lib.ID
}
}
Второе (неудачное) использование - это выражение с простым вызовом ToProjected, ToProjected компилируется в IL, и во время выполнения драйвер mongo не может получить информацию о том, что ID = lib.ID (по крайней мере, не таким простым способом как с выражениями). В частности, здесь MethodCallExpression . И визуализация второго выражения:
.Lambda #Lambda1<System.Func`2[ConsoleApp1.Program+MyOriginalClass,ConsoleApp1.Program+MyProjectedClass]>(ConsoleApp1.Program+MyOriginalClass $lib)
{
.Call ConsoleApp1.Program.ToProjected($lib)
}
ToProject может быть переписан как:
Expression<Func<MyOriginalClass, MyProjectedClass>> ToProjected()
{
return lib => new MyProjectedClass { ID = lib.ID };
}
И используется как:
var data2 = GetData(ToProjected());