Web应用包含翻页、多个不同字段组合搜索、按不同字段升序降序排列等需求,最优雅的实现方式是啥

这些都是不同层级的模块该做的事情,建议题主可以参考各大主流框架的实现方式。不过基本上也逃不出一下几个模式1、DB层,还是你所说的ORM也好ActiveRecord也好,都属于DB层,可以把数据库想象成水库,DB层么,就是自来水公司。2、Component(widget、block),独立功能的小部件。你问题里的,应该就一个Table部件,然后这个Table部件需要实现Searchable,以及Sortable的接口。也可能是添加其他部件,如SearchForm,并在Table的部件中实现SearchForm的委托。当然,这个Table部件,还能添加Pager部件,或者Pager就是Table的内在机制。3、主题层,系统对于不同部件可以实现自己独立的主题(可以全局主题,也可以是默认主题)。就这些东西了,不同的框架有不同的实现方式。关于这方面的学习方式,那就是稍微研究下其他框架的架构,是“稍微”,不要纠结他的实现,去理解他们的思想。还有,多搞懂几门编程语言也很重要,架构着方面的东西,静态语言对于这些方面更加有深度,动态语言的话相对来说弱了很多。
■网友
初学PHP的时候也为这个绞尽脑汁。更夸张的是,不同的WEB应用可能访问同一个数据源,这时候要写N多个sql的查询拼接。后来做这个做到自己都想吐了,感觉写这些东西就是在浪费生命。于是处于对自身生命的珍惜,就写了个通用的TABLE组件,使用这个组件可以分页,排序,用户还可以自定义搜索字段(为了方便,可以默认设置一些常用的搜索字段,省去了每次都需要自定义的麻烦),每个字段的显示可以配置回调函数,实现字段的模板输出。除此之外,我还自以为豪的为这个TABLE组件实现了透视查询(COUNT,MAX,MIN...等等),绘图(饼图,折现图,柱状图...),以及EXCEL导出等等功能(注意: 这些不同的视图都是调用的同一份数据生成逻辑)。生成这样一个TABLE视图,程序猿只需要配置这个视图的库表地址,然后点击一个加载字段的按钮,所有的字段均生成了,然后再根据需要筛选字段,并为各个字段配置不同的规则。用户来使用只需要在TABLE界面上点点鼠标,就可以完成灵活的查询并生成各式各样的视图结果。如果你为这个TABLE设置了可编辑权限,那么用户可以对任何一行数据进行编辑,相当于一个微型的管理系统。这货就是一个易用版的PHPMyAdmin(纯鼠标操作,无学习成本)+ WEB版的EXCEL(数据整理+丰富的在线视图)。后期把整个组件优化成一个URL,其他任何系统可以方便的通过参数(指定字段,指定排序等等)来引入(iframe, jsonp, jsondata, jpg, html)不同的视图。这样便形成了TABLE服务。这个服务的入参就是URI,出参就是不同的视图。在某些场景下,这比起优雅的代码实现来说,意义更大,因为TABLE组件提供了更优雅更完整的用户体验。
■网友
===========================翻页
....
order by \u0026lt;column\u0026gt;
offset \u0026lt;begin\u0026gt; rows
fetch next \u0026lt;count\u0026gt; rows only
===========================字段组合
一般来说,这种只能组合字符串了。.net的SqlCommand可以帮你做escaping,无需关心sql注入的事情
不过既然是搜索,让用户自己选择要搜什么column显然是太粗暴了,用户很容易组合出一些query是你的index不能覆盖的。这有两种情况,第一种是这种query不make sense,第二种是你index没建好,总之性能都特别低。经过精心tunning过的sql数据库,就算十分巨大,一个query 0.1秒内返回还是没问题的。
【Web应用包含翻页、多个不同字段组合搜索、按不同字段升序降序排列等需求,最优雅的实现方式是啥】 所以说还是自己index一下做个简单粗暴的低智能搜索引擎吧(其实没有想象中那么难)

■网友
可以用ORM + Linq. 不过这样是更优雅还是更笨拙,我就不清楚了:public IQueryable\u0026lt;Sheet\u0026gt; Query(SheetQueryParameters p, SheetOrderBy? order, bool? descending, int pageSize, int pageIndex){\tvar sheets = GetViewableSheets();\tif (p.Date != null)\t\tsheets = sheets.Where(x =\u0026gt; x.Date == p.Date);\tif (p.VendorId != null)\t\tsheets = sheets.Where(x =\u0026gt; x.VendorId == p.VendorId);\tif (p.SheetNo.NotNullNorEmpty())\t\tsheets = sheets.Where(x =\u0026gt; x.SheetNo.EndsWith(p.SheetNo));\tif (p.Mobile.NotNullNorEmpty())\t\tsheets = sheets.Where(x =\u0026gt; x.Mobile.EndsWith(p.Mobile));\t.....\tif (order == null)\t{\t\torder = SheetOrderBy.Date;\t\tdescending = true;\t}\tIOrderedQueryable\u0026lt;Sheet\u0026gt; ordered;\tswitch (order)\t{\t\tcase SheetOrderBy.SheetNo:\t\t\tordered = @descending.GetValueOrDefault(true)\t\t\t\t? sheets.OrderByDescending(x =\u0026gt; x.SheetNo)\t\t\t\t: sheets.OrderBy(x =\u0026gt; x.SheetNo);\t\t\tbreak;\t\tcase SheetOrderBy.DaysDelayed:\t\t\tordered = descending.GetValueOrDefault(true)\t\t\t\t\t\t? sheets.OrderByDescending(x =\u0026gt; x.DelayedDays)\t\t\t\t\t\t: sheets.OrderBy(x =\u0026gt; x.DelayedDays);\t\t\tbreak;\t\t....\t}\treturn ordered.ThenByDescending(x =\u0026gt; x.UpdateTime)\t\t.ToPagedList(pageIndex, pageSize);}


推荐阅读