У меня возникла проблема при попытке сделать мои запросы LINQ to SQL и сопоставление с объектами моего домена СУХИМ без затрат на многократные поездки в БД. Учитывая этот пример:
var query1 = from x in db.DBProducts
select new MyProduct
{
Id = x.ProductId,
Name = x.ProductName,
Details = new MyProductDetail
{
Id = x.DBProductDetail.ProductDetailId,
Description = x.DBProductDetail.ProductDetailDescription
}
}
Запрос совершит ОДНО туда и обратно в БД. Большой! Однако проблема, с которой я сталкиваюсь, заключается в том, что в конечном итоге у меня также будет метод GetProductDetails, который также должен будет выполнить некоторые ЖЕ сопоставления «объект данных -> объект домена», очень похожие на описанные выше.
Чтобы облегчить некоторые отображения, я подумал, что было бы неплохо расширить классы объектов частичных данных, чтобы сделать отображение для меня, например, так:
public partial class DBProduct
{
MyProduct ToDomainObject()
{
return new MyProduct
{
Id = this.ProductId,
Name = this.ProductName,
Details = this.DBProductDetails.ToDomainObject()
};
}
}
public partial class DBProductDetail
{
MyProductDetail ToDomainObject()
{
return new MyProductDetail
{
Id = this.ProductDetailId,
Description = this.ProductDetailDescription
};
}
}
Nice! Теперь я мог бы просто переписать query1 следующим образом:
var query1 = from x in db.DBProducts
select x.ToDomainObject();
Это делает код более СУХИМЫМ и более читабельным. Кроме того, другие запросы, которым необходимо выполнить сопоставление того же типа, могут просто использовать метод ToDomainObject () для сопоставления. Это работает, но с затратами. При просмотре через Profiler первый запрос будет вызывать db ONCE, при необходимости объединяя таблицы. Второй запрос не присоединяется должным образом, таким образом делая несколько обращений к БД. Есть ли способ выполнить то, что я пытаюсь сделать: рефакторинг запросов LINQ to SQL, чтобы сопоставление с объектами домена было СУХОЙ (без дублирования кода)?