我应该使用 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<T>
(LINQ to X) 的接口。因此,业务层没有IQueryable<T>
的问题。如何在 DAL 中实现查询是次要的。你可以使用 LINQ 来实现它们,你可以使用 NHibernates 标准 API 来实现它们,你甚至可以使用普通的旧 SQL 来实现它们。
【参考方案1】:
我认为您错过了跨越技术与模式的一些东西。 Linq 是一种以非常有用的方式处理数据的低级技术。但这不是一种模式,与它没有任何联系。
另一方面,如果您想实现查询对象模式(这是一个很好的主意,如果您需要实现非常简单的数据查询功能,并且您可以使用倍数的方式查询您的数据),您可以实现它使用或不使用 Linq。这完全取决于你。而 linq 本身并不能帮你实现查询对象。
此外,即使您决定借助查询对象来实现数据访问层,这并不意味着您不需要使用服务或存储库模式。在大多数情况下,特别是如果您使用到达查询功能,您应该能够同时实现这两种功能,因为很难实现具有您需要的所有方法的服务或存储库。
但无论如何,对于复杂的项目,允许用户在 DAL 代码之外使用 IQueryable 会导致严重的问题。简短示例:您的一些数据更改,现在它包含 ID1 字段 insted ID 字段。如果您有单一的方法来查询您的数据,您只需在一个地方更改代码,但如果您只允许在任何地方使用 IQueryable,那么您需要找到所有使用 ID 的地方并将其替换为 ID1。
而且,如果您的查询功能很差,那么您最不需要查询对象或存储库等。活动记录模式就足够了。
【讨论】:
我在搜索有关这些模式的信息时发现的几个不同的帖子/博客中获得了有关链接的想法。我在这里读到了***.com/questions/11964578/… 和其他一些我不记得的其他人,但这就是我的问题。我想知道 thous=ge 是否有一个很好的来源/示例可以使用 IQueryable以上是关于我应该使用 Linq 和 IQueryable<T> 来实现查询对象模式的主要内容,如果未能解决你的问题,请参考以下文章
使用 LINQ 的 IQueryable 左外连接的扩展方法
简单的 LINQ 连接以返回 IQueryable 对象集合
MVC / LINQ /合并Iqueryable对象[关闭]