ラムダを使用する場合、ラムダを定義するときに表示される値を渡すことができます。これはクロージャーと呼ばれ、変数をラムダに持ち上げることができます。例えば
void call_lambda(Func<int> f)
{
Console.WriteLine("Int value is " + f());
}
/* ... */
void lambda_caller()
{
int i = 150;
call_lambda(() => i);
}
i
のスコープに存在しない場合でも、 の正しい値を出力しcall_lambda
ます。どのラムダでも同じことが起こります。変数が定義されているスコープ内の変数を定義に使用でき、実行時に解決されます。
あなたの場合、マッピングの外側で接続を定義し、実行のためにラムダに渡すことができます。
var dbConnection = createConnection();
AutoMapper.Mapper.CreateMap().ForMember(dest => dest.deviceColor, opt => opt.ResolveUsing((source) => { return MyTools.GetDeviceColor(dbConnection, source.DeviceId); }));
ただし、落とし穴があります。変数をラムダに持ち上げることで、その制御をラムダに明け渡すことはありません。マッピングを定義した後に接続を閉じると、接続が閉じていることがわかっているため、ラムダは実行できません。したがって、制御を維持するために、接続セットアップ全体とクエリをラムダにラップすることをお勧めします。ラムダ内では、マッピングごとに DB にヒットするのを避けたい最適化をセットアップできますが (キャッシュなど)、実際にはラムダ外で接続をセットアップしないでください。