Linq to Sql DB Object to Domain Отображение и производительность объектов - PullRequest
5 голосов
/ 10 марта 2010

У меня возникла проблема при попытке сделать мои запросы 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, чтобы сопоставление с объектами домена было СУХОЙ (без дублирования кода)?

1 Ответ

1 голос
/ 10 марта 2010

Использование AutoMapper . После того, как вы попробуете это, вряд ли вы когда-нибудь увидите такой код:

new MyProduct
{
    Id = x.ProductId,
    Name = x.ProductName,
    Details = new MyProductDetail
    {
        Id = x.DBProductDetail.ProductDetailId,
        Description = x.DBProductDetail.ProductDetailDescription
    }
}
...