我应该使用 Linq 和 IQueryable<T> 来实现查询对象模式

Posted

技术标签:

【中文标题】我应该使用 Linq 和 IQueryable<T> 来实现查询对象模式【英文标题】:Should I use Linq and IQueryable<T> to implement the Query object Pattern 【发布时间】:2013-01-23 22:50:19 【问题描述】:

假设:在可预见的未来,该解决方案将始终是 MS、C#、.Net、SQL Server、Entity Framework 和 DAL、BLL 等不会传递给外部源,但可以在单独的应用程序中使用同一套房

A.我应该使用 Linq 和 IQueryable 来实现 Query 对象模式而忘记处理存储库和/或 DAO 吗?

B.如果有什么适合该模式的,我必须做什么/实施?还没有找到太多的例子。

【问题讨论】:

我非常成功地使用了in this answer 概述的技术。 对不起丹尼尔,我现在才看到你=r 链接。谢谢。应该让我开始 - 谢谢 Daniel,所以您使用的是 Linq fopr 您的查询,对吗?因为在一条评论中你说这对不同提供者的不同查询结果是不好的。只是好奇,不过我会使用不同的提供商 这正是链接答案的重点:您为您的业务代码提供了一个不使用 IQueryable&lt;T&gt; (LINQ to X) 的接口。因此,业务层没有IQueryable&lt;T&gt; 的问题。如何在 DAL 中实现查询是次要的。你可以使用 LINQ 来实现它们,你可以使用 NHibernates 标准 API 来实现它们,你甚至可以使用普通的旧 SQL 来实现它们。 【参考方案1】:

我认为您错过了跨越技术与模式的一些东西。 Linq 是一种以非常有用的方式处理数据的低级技术。但这不是一种模式,与它没有任何联系。

另一方面,如果您想实现查询对象模式(这是一个很好的主意,如果您需要实现非常简单的数据查询功能,并且您可以使用倍数的方式查询您的数据),您可以实现它使用或不使用 Linq。这完全取决于你。而 linq 本身并不能帮你实现查询对象。

此外,即使您决定借助查询对象来实现数据访问层,这并不意味着您不需要使用服务或存储库模式。在大多数情况下,特别是如果您使用到达查询功能,您应该能够同时实现这两种功能,因为很难实现具有您需要的所有方法的服务或存储库。

但无论如何,对于复杂的项目,允许用户在 DAL 代码之外使用 IQueryable 会导致严重的问题。简短示例:您的一些数据更改,现在它包含 ID1 字段 insted ID 字段。如果您有单一的方法来查询您的数据,您只需在一个地方更改代码,但如果您只允许在任何地方使用 IQueryable,那么您需要找到所有使用 ID 的地方并将其替换为 ID1。

而且,如果您的查询功能很差,那么您最不需要查询对象或存储库等。活动记录模式就足够了。

【讨论】:

我在搜索有关这些模式的信息时发现的几个不同的帖子/博客中获得了有关链接的想法。我在这里读到了***.com/questions/11964578/… 和其他一些我不记得的其他人,但这就是我的问题。我想知道 thous=ge 是否有一个很好的来源/示例可以使用 IQueryable 和 Ling 开始使用查询对象模式 - 谢谢 我认为最佳答案的作者在他看来是非常错误的。他的方法对于纯查询部分的小项目是正常的(在我的回答中我也告诉过你这会过度工程,但是在大项目中使用他的方法会导致代码重复、复制粘贴、错误和很多其他问题)跨度> 我也刚看到这篇文章说 Linq 是 QO 模式 besnikgeek.blogspot.com/2010/08/… 还在考虑中...谢谢 是的。对于某种抽象级别,linq 是查询对象实现。但它只连接到低级 linq 实现,根本没有连接你的 DAL。说:伙计们,我在我的应用程序的 DAL 中使用 QO 模式是错误的,因为我使用的是 linq。 不确定我是否关注你。我将使用实体框架,并通过 tjat 查询业务对象,我不会直接去 DAL,在这里也找到了第三个 \\***.com/questions/7077729/… 还在考虑它...谢谢

以上是关于我应该使用 Linq 和 IQueryable<T> 来实现查询对象模式的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 的 IQueryable 左外连接的扩展方法

简单的 LINQ 连接以返回 IQueryable 对象集合

MVC / LINQ /合并Iqueryable对象[关闭]

如何测试我的 Linq IQueryable 是不是已执行

你会推荐啥支持 Linq/Iqueryable 的 OR/M 工具? [关闭]

如何解决 - 无法使用Automapper将Generic.List强制转换为Linq.IQueryable?