在啥情况下,我想创建从 Linq 到 Sql 结果的自定义业务对象?

Posted

技术标签:

【中文标题】在啥情况下,我想创建从 Linq 到 Sql 结果的自定义业务对象?【英文标题】:In what scenarios would i want to create custom business objects from Linq to Sql results?在什么情况下,我想创建从 Linq 到 Sql 结果的自定义业务对象? 【发布时间】:2011-04-03 23:03:56 【问题描述】:

一个简单的 linq to SQL 查询可能会返回一个产品对象。显然我可以将此对象传递给我的业务层,然后直接针对该对象读取和更新数据。

我见过很多实现,在执行 linq 查询之后,结果对象被映射(通过自动映射器或手动)到自定义业务对象。因此,对于我可能拥有 linq 对象的产品:

product.ProductId 和 产品.产品名称

然后我会像这样定义一个自定义产品业务对象:

class BusineszProduct

    string ProductId;
    string ProductName;

还有一些简单的映射代码,例如:

BusinessProduct myProduct = new BusinessProduct(); myProduct.ProductId = 产品.ProductId; myProduct.ProductName = 产品.ProductName;

然后将 myProduct 传递给我的业务层,修改它,读取它等等,然后更新 linq 对象。

我希望在什么情况下创建自定义 BusinessProduct 类?

【问题讨论】:

【参考方案1】:

恕我直言,一般原因是将您的业务实体从 Linq2SQL 实体附带的 Linq2SQL ORM 包中解耦/解开

但是,在极端情况下,您可能有多个映射:

“数据访问”层的 Linq2SQL 实体 - 但是这些实体与 L2S DataContext 紧密耦合 POCO/业务实体将用于业务规则应用、验证等 如果您使用 Web 服务或 WCF,您还可以将数据表示为消息实体,例如如果您需要在通过网络进行序列化时以非常特定的格式呈现实体 最后,如果您有 MVC / MVP / MVVM UI 架构,您可能需要为您的视图量身定制的实体

【讨论】:

第 1 部分-很好的答案。Bullet 1-完全有意义 b/c 即使如果我使用存储库模式,Linq to Sql 给了我数据库独立性,它仍然将我耦合到关系数据库存储。然而,如果我创建另一个带有此对象映射的层,我可以更轻松地将我的数据存储更改为 nosql db。 #2-Linq 和 MVC 似乎有大量的原生验证支持,所以我不确定这个是否会向我注册。 第 2 部分-#3-为什么我想通过网络以特定格式表示数据而不是使用 Linq 对象?#4-完全有意义。我已经读到您的视图和支持该视图的模型之间应该有 1:1 映射,因此在将模型数据从控制器传递到视图之前进行映射是有意义的。 icky 的替代方案是为每个视图创建一个 Linq 查询。我的 cmets 有意义吗? 当然 - 这是一个极端的例子 Point 2 - Moot point,但在 N 层 SOA 堆栈中,使用 DI 等时对 DAL 的程序集引用似乎是错误的。 Point 3 - If for例如,您已承诺向消费者发布特定的 XSD / WSDL 合同,那么您确实需要对 xmnls、元素与属性、名称等进行精细控制。但如果消费者在您自己的控制之下,则通常不需要这样做(例如您自己的客户端/Ajax 或类似的)【参考方案2】:

在我的应用程序中,我执行了一个 Linq 查询,它连接了六个不同的表,并从每个表中提供了几列。没有与该信息集匹配的特定于表的对象类型。因此,我创建了一个自定义业务类来处理记录集。

您可以自己查看(http://www.njtheater.org)

我按日期从Productions 表中选择。它连接到 Play 表(我得到标题和描述)、Troupes 表(我得到剧院公司名称)、Venues 表(我得到剧院名称和城市)。 Plays 表连接到 PlayCredits 表,后者连接到 People 表(我在其中获得剧作家的名字)

【讨论】:

您说,“没有特定于表的对象类型与该信息集相匹配。因此,我创建了一个自定义业务类来处理记录集。”您的意思是您正在创建一个自定义对象,例如我上面的 BusinessProduct 类,还是您的 Linq 结果实际上是一个自定义业务类? 我为此创建了一个特定的类,主要是因为我需要在显示这些信息之前对其进行一些后处理,并且匿名类中的属性是只读的。

以上是关于在啥情况下,我想创建从 Linq 到 Sql 结果的自定义业务对象?的主要内容,如果未能解决你的问题,请参考以下文章

SQLserver数据库中,在啥情况下删除数据不能成功?

SQLite中的页面缓存在啥情况下会被清除?

MySQL like 在啥情况下会走索引

Azure WebJobs SDK - 在啥情况下需要创建 JobHost 对象?

linq to sql select和where的区别

在啥情况下 viewWillAppear 会被调用?