3

データベースへの単一のクエリを生成する次の式があります。

db = new MyDataContext();
var productInCity = db.Products
                         .Where(n => n.id == 2)
                         .Select(k => new ProductInCityDto()
                         {
                              ProductName = k.ProductName,
                              CityName = k.Store.City.Name,
                              CountryName = k.Store.City.Country.Name
                              .
                              .
                              . 
                         })
                         .FirstOrDefault();

関数、拡張メソッド、またはオブジェクトのコンストラクターにマッピングを配置することで、このコードをよりクリーンにしたいのですが、次のようになります。

db = new MyDataContext();
var productInCity = db.Products
                        .Where(n => n.id == 2)
                        .Select(k => new ProductInCityDto(k))
                        .FirstOrDefault();

ただし、この場合、DBへの複数のクエリが生成されます(私はLinqToSqlプロファイラーを使用します)。

コードの可読性を向上させるために、マッピング(Selectステートメント)を分離する方法はありますか?

4

2 に答える 2

3

はい、IQueryableのSelect拡張メソッドの実際のシグネチャを見ると、関数ではなく式>を使用していることがわかります。

だから、それをするだけです...

Expression<Func<Product, ProductInCityDto>> MyMappingExpression
{
    get
    {
        return product => new ProductInCityDto
        {
            ...
        }
    }
}

その後

db = new MyDataContext();
            var productInCity = db.Products.Where(n => n.id == 2)
                .Select(MyMappingExpression)
            .FirstOrDefault();

プロセスでMyMappingExpressionを使用する必要がある場合は、それをに変換することをお勧めします。

Func<Product, ProductInCityDto> 

Expression.Compile()メソッドを呼び出すことによって。

于 2013-02-22T09:24:07.450 に答える
0

手作業でマッピングを作成する代わりに、AutoMapperを使用できます。ただし、サードパーティのツールを使用してマッピングを作成したくない場合は、クエリを次のように変更してください。

var productInCity = new ProductInCity(
                   db.Products.Include("Store").SingleOrDefault(n => n.id == 2));
于 2013-02-22T09:29:22.980 に答える