【问题标题】:Linq to Sql DB Object to Domain Object mapping and performanceLinq to Sql DB 对象到域对象的映射和性能
【发布时间】:2010-03-09 23:18:26
【问题描述】:

我在尝试使我的 LINQ to SQL 查询和到我的域对象的映射 DRY 时遇到问题,而不会产生多次往返数据库的成本。给定这个例子:

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
        };
    }
}

不错!现在,我可以简单地重写 query1 如下:

var query1 = from x in db.DBProducts
            select x.ToDomainObject();

这使代码更干,更易读。此外,需要执行相同类型映射的其他查询可以简单地使用 ToDomainObject() 方法进行映射。它有效,但需要付出代价。在通过 Profiler 观看时,第一个查询将调用 db ONCE,并在必要时加入表。第二个查询没有正确加入,因此对数据库进行了多次调用。有没有办法完成我正在尝试做的事情:重构 LINQ to SQL 查询,以便映射到域对象是 DRY(无代码重复)?

【问题讨论】:

  • 这一行看起来不对... Details = this.ToDomainObject() - 我认为您不想递归调用 ToDomainObject()!也许您的意思是 Details = this.DBProductDetail.ToDomainObject() ?
  • 哦,不错的收获!我更新了原始帖子以反映这一点。仍然没有解决我的问题.. :(
  • +1。这个有趣的问题没有引起更多讨论,这是犯罪。
  • +1。你找到这个答案了吗?我很感兴趣,我必须做同样的事情。

标签: c# sql-server asp.net-mvc linq-to-sql delayed-execution


【解决方案1】:

使用AutoMapper。一旦你尝试过,你就不太可能看到这样的代码:

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

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多