私はこれを見つけようとしてきましたが、運がありませんでした。person と address の 2 つのテーブルを持つデータベースがあるとします。
table person
id int
name varchar(50)
addressId int
table address
id int
street varchar(50)
country varchar(50)
私のデータ層には、アドレスのビジネス オブジェクトがあり、外部の呼び出し元に公開されています。作成コードを SQL レベルで一元化するために使用できる式を見つけました。このように私は書く必要はありません:
db.Address.Select( x => new Biz.Address{ street = x.street} ).ToList(); //and all the other properties etc
どこにでも。代わりに、次のことができるようになりました。
db.Address.Select(AddressDto.ToDto).ToList();
このコードの使用:
internal static class AddressDto
{
internal static readonly Expression<Func<Address, Biz.Address>> ToDto =
src => new Biz.Address
{
Id = src.id,
Street = src.street,
Country = src.country
};
}
問題は、Person オブジェクトに対して同じことをしようとしていることです。このメソッドを再利用して住所を入力したいと考えています。しかし、その中で表現を利用することはできないようです。
class Person
{
int Id;
string Name;
Address address;
}
internal static class PersonDto
{
internal static readonly Expression<Func<Person, Biz.Person>> ToDto =
src => new Biz.Person
{
Id = src.id,
Name = src.name,
address = src.Address //How do i set this to an expression?
};
}
式を要求する理由は、通常の方法を使用すると正常にコンパイルされますが、実行時に爆発するためです。これは、オブジェクト ストアに変換できないためです。しかし、もしそうなら:
address = AddressDto.ToDto(src.Address)
コンパイラは、メソッド、デリゲート、またはイベントが必要なため、それを拒否します。これを行う方法を見つけたいと思います。私が実装しようとしているアイデアは、エンティティをビジネス オブジェクトにマップするコードを基本的に一元化することです。これにより、スキーマが変更されたときに他のコードがクリーンに保たれ、メンテナンスが容易になります。私が作成して維持しなければならない別のメソッド シグネチャがある場合は、それを同じファイルに入れて一緒に使用するので問題ありません。これを機能させる魔法の組み合わせが見つからないようです。
ありがとう!
カーンの提案から更新。
これを linq to objects エリアに移動するだけです。一部のクエリがどのように構築されているかという理由で、SQL エンドでこれを実行しようとしています。後で .ToList を呼び出したくありません。
私が行った場合:
internal static class PersonDto
{
internal static readonly Func<Person, Biz.Person> ToDto =
src => new Biz.Person
{
Id = src.id,
Name = src.name,
address = new Biz.Address { id = src.Address.Id }
};
}
その後、それは機能します。新しい通話を置き換えたいだけです。