gpt4 book ai didi

c# - Linq to Sql DB 对象到领域对象的映射和性能

转载 作者:太空狗 更新时间:2023-10-29 23:48:43 27 4
gpt4 key购买 nike

我在尝试使我的 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 一次,在必要时连接表。第二个查询没有正确加入,因此对数据库进行了多次调用。有没有一种方法可以完成我正在尝试做的事情:重构 LINQ to SQL 查询,以便到域对象的映射是 DRY(无代码重复)?

最佳答案

使用AutoMapper .尝试过后,您将不太可能看到这样的代码:

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

关于c# - Linq to Sql DB 对象到领域对象的映射和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2413365/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com