2

私はこれを見つけようとしてきましたが、運がありませんでした。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 }
               };
     }

その後、それは機能します。新しい通話を置き換えたいだけです。

4

1 に答える 1

0

コンパイラは、単に期待しているときにラップされたものAddressDto.ToDtoを渡しているため、好きではありませんFunc<>Expression<>Func<>

address = AddressDto.ToDto(src.Address)

署名から を削除し、Expression動作するかどうかを確認します。

internal static class AddressDto
{
    internal static readonly Func<Address, Biz.Address> ToDto =
        src => new Biz.Address
                   {
                       Id = src.id,
                       Street = src.street,
                       Country = src.country
                   };
}

internal static class PersonDto
{
    internal static readonly Func<Person, Biz.Person> ToDto =
        src => new Biz.Person
                   {
                       Id = src.id,
                       Name = src.name,
                       address =  AddressDto.ToDto(src.Address)
                   };
}
于 2013-10-02T15:50:07.653 に答える