gpt4 book ai didi

c# - 我应该使用什么设计模式来为 Linq 搜索屏幕创建查询和文本框之间的简单绑定(bind)映射?

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:53 24 4
gpt4 key购买 nike

一遍又一遍,我发现自己在开发 WinForm 业务应用程序屏幕,其中有一堆用于搜索条件的文本框,然后是一个搜索按钮。这些使用 Linq 映射到表达式,然后传递到我的 Linq2Sql 层。

我想创建一种简单的方法来使用“包含”、“startswith”、“精确匹配”等不同选项将这些文本框“绑定(bind)”到基础查询...

我想象的是这样的(注意 SearchBinderT 是虚构的):

SearchBinder<Customer> searchBinder = new SearchBinder<Customer>();
searchBinder.Bind(txtFirstName, a=>a.FirstName, SearchBinderOptions.StarsWith);
searchBinder.Bind(txtLastName, a=>a.LastName, SearchBinderOptions.StarsWith);
searchBinder.Bind(txtTelephone, a=>a.Phone, SearchBinderOptions.Equals);
searchBinder.SetAction(btnSearch, MyMethodThatHandlesTheExpressionTreeAndFillsTheResults);

然后点击搜索会自动生成文本框不为空的表达式树并执行搜索。但这只是我脑海中的一种模式——还有更多。我主要专注于快速应用程序开发。

  • 为此您会使用什么设计模式(或者我认为什么是好的)?
  • 您将如何处理其他数据类型(日期/数字小于/大于)

最佳答案

lambda 的延迟执行和捕获状态不会解决这个问题吗?

Predicate<Customer> searchQuery = c => {
c.FirstName.StartsWith(txtFirstName.Text)
&& c.LastName.StartsWith(txtLastName.Text)
&& c.Phone == txtTelephone.Text;
}

void btnSearch_Click(object sender, EventArgs e) {
return IEnumerable<Customer>.Where(searchQuery);
}

searchQuery在单击按钮之前不会执行,因此无需抽象出与“构建器”组件的比较。访问文本框存在整个多线程问题,但您可以使用 Expression<T>相反,用 Control.Invoke 分解和重建.或者,用 Invoke 来写首先。或者,将其发送回 UI 线程以运行。

但是,如果您真的想要自己的设计 - 我建议使用 Expression<T>而不是您拥有的比较运算符。它更加灵活,可以为您节省大量工作。

至于设计模式,我所知道的最接近的是 Query Object - [N]Hibernate 的形式为 Criteria .不过,它更多地涉及构建动态查询,而不是绑定(bind)到 UI 元素(同样,我没有看到这一点)。在您的示例中,您的查询是硬编码的 - 所以我不确定会有什么好处。

关于c# - 我应该使用什么设计模式来为 Linq 搜索屏幕创建查询和文本框之间的简单绑定(bind)映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/855378/

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