- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在通过 DAL Repository 构建时,我偶然发现了一个叫做管道和过滤器的概念。我读过它here ,在这里看到了来自 here 的截屏视频.我仍然不确定如何实现这种模式。理论上一切听起来都不错,但我们如何在企业场景中真正实现这一点?
如果您在问题中提到的数据映射器/ORM 的上下文中对此模式有任何资源、提示或示例,我将不胜感激。
提前致谢!!
最佳答案
最终,LINQ 上 IEnumerable<T>
是一个管道和过滤器实现。 IEnumerable<T>
是一个流 API - 意味着数据在你要求时延迟返回(通过迭代器块),而不是一次加载所有内容,并返回一个大的记录缓冲区。
这意味着您的查询:
var qry = from row in source // IEnumerable<T>
where row.Foo == "abc"
select new {row.ID, row.Name};
var qry = source.Where(row => row.Foo == "abc")
.Select(row = > new {row.ID, row.Name});
OrderBy
,
GroupBy
等。对于大量工作,Jon 和我自己在
Push LINQ 上工作用于在这种情况下进行聚合而无需缓冲。
IQueryable<T>
(被大多数 ORM 工具暴露 - LINQ-to-SQL、 Entity Framework 、LINQ-to-NHibernate)是一个稍微不同的野兽;因为数据库引擎将完成大部分繁重的工作,所以大部分步骤可能已经完成 - 剩下的就是消耗
IDataReader
并将其投影到对象/值 - 但这通常仍然是管道(
IQueryable<T>
实现
IEnumerable<T>
),除非您调用
.ToArray()
,
.ToList()
等等。
IQueryable<T>
在存储库内编写可组合查询,但它们不应该离开存储库 - 因为这会使存储库的内部操作受调用者的影响,因此您将无法正确进行单元测试/配置文件/优化等。我'已经开始在存储库中做一些聪明的事情,但返回列表/数组。这也意味着我的存储库不知道实现。
IQueryable<T>
来自存储库的方法非常大;例如,这将允许调用者添加分页/过滤器/等 - 但请记住,他们尚未实际使用数据。这使得资源管理变得痛苦。此外,在 MVC 等中,您需要确保 Controller 调用
.ToList()
或类似的,因此它不是控制数据访问的 View (否则,您将无法正确地对 Controller 进行单元测试)。
public Customer[] List(string name, string countryCode) {
using(var ctx = new CustomerDataContext()) {
IQueryable<Customer> qry = ctx.Customers.Where(x=>x.IsOpen);
if(!string.IsNullOrEmpty(name)) {
qry = qry.Where(cust => cust.Name.Contains(name));
}
if(!string.IsNullOrEmpty(countryCode)) {
qry = qry.Where(cust => cust.CountryCode == countryCode);
}
return qry.ToArray();
}
}
ToArray
之前什么也没有发生。 .此时,获取并返回数据(处理过程中的数据上下文)。这可以完全单元测试。如果我们做了类似的事情但刚刚返回
IQueryable<T>
,调用者可能会执行以下操作:
var custs = customerRepository.GetCustomers()
.Where(x=>SomeUnmappedFunction(x));
SomeUnmappedFunction
转换为 TSQL 等)。不过,您仍然可以在存储库中做很多有趣的事情。
class CustomerRepository {
public Customer[] List(
string name, string countryCode,
int? pageSize, int? pageNumber) {...}
}
interface ICustomerRepository {
Customer[] List(
string name, string countryCode,
int? pageSize, int? pageNumber);
}
static class CustomerRepositoryExtensions {
public static Customer[] List(
this ICustomerRepository repo,
string name, string countryCode) {
return repo.List(name, countryCode, null, null);
}
}
ICustomerRepository
上有了虚拟重载(作为扩展方法) - 所以我们的来电者可以使用
repo.List("abc","def")
无需指定分页。
关于linq-to-sql - 你如何使用 LinqToSQL/ Entity Framework /NHibernate 实现管道和过滤器模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/679027/
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!