gpt4 book ai didi

c# - LINQ、存储库模式和数据库抽象

转载 作者:行者123 更新时间:2023-11-30 15:12:37 24 4
gpt4 key购买 nike

我现在已经花了一些时间来解决一个问题,直到现在我还没有解决方案。我有一个预定义的非常庞大的数据库,其结构是固定的。我使用存储库模式在服务代码和数据库逻辑之间创建一个抽象层。问题是,在将它们从存储库中传递出去之前,我需要对数据库对象应用一些处理。因此我不能直接使用 Linq 实体。

存储库方法基本上是这样的:

public IList<Bookingcode> FindBookingcode(int id) {
return (from b in _db.BOOKINGCODE
where b.ID == id
select new Bookingcode {
Id = b.ID,
Name = b.NAME.Trim()
}).ToList();
}

目前效果很好。但是我有很多应该单独组成的对象。FindBookingcode() 应该返回一个几乎完整的对象以及目录等其他对象。我现在的问题是我必须像这个例子一样多次重写映射:

public IList<Bookingcode> FindBookingcode(int id) {
return (from b in _db.BOOKINGCODE
join c1 in _db.CATALOG on b.CATALOGID equals c1.ID
where b.ID == id
let refs = (
from bc1 in _db.BOOKINGCODE
join p in _db.PACKAGE on bc1.ID equals p.BOOKINGCODE
join bc2 in _db.BOOKINGCODE on p.PACKAGEREF equals bc2.ID
join c in _db.CATALOG on bc.CATALOGID on bc2.CATALOGID equals c.ID
where bc1.ID == b.ID
select new PackageInfo {
ID = p.ID
BookingcodeRef = new Bookingcode {
ID = bc2.ID,
Catalog = new Catalog { ID = c.ID }
}
})
select new Bookingcode {
ID = b.ID,
PackageInfo = refs.ToList()
}).ToList();

}

我在存储库中也有一些 L2O 处理,用于组装返回的对象。另一件事我没有很好的解决方案,是一种告诉存储库它应该获取什么的方法,比如 FindBookingcode(id, includePackageInfo, includeCatalog)。

下面是问题:

1) 这种方法完全愚蠢吗?

2) 你能指导我找到一个使重新映射更简单的解决方案吗?

3) DDD的标准机制如何实现

最佳答案

在我的存储库中,我有一个单独的构建方法,它接受 LINQ to SQL 实体并返回一个业务对象。

构建方法看起来像(this.Container 是一个 Unity IoC 容器,对于示例来说并不重要):

private IGroup BuildGroup(Entities.Group group)
{
IGroup result = this.Container.Resolve<IGroup>();
result.ID = group.GroupID;
result.Name = group.Name;

return result;
}

然后每个方法使用build方法返回一个业务对象:

public override IGroup GetByID(int id)
{
try
{
return (from g in this.Context.Groups
where g.GroupID == id && g.ActiveFlag
select this.BuildGroup(g)).Single();
}
catch (InvalidOperationException)
{
return null;
}
}

这通过从数据库中取回每个 LINQ to SQL 实体并通过构建方法运行它来实现,因此在这种情况下您的结果将是您的业务对象的可枚举而不是 LINQ to SQL 实体。

关于c# - LINQ、存储库模式和数据库抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1049867/

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