LINQ to SQL集成到应用程序中需考虑的一些问题

1、LINQ to SQL集成到应用程序中需考虑的一个问题, 到底应该返回IQueryable<T>还是IQueryable? 或许这个列表还应该继续扩展为T, List<T>, 对于Business Layer来说, 到底应该选择哪一种?

2、需要一个分页功能; 到这一步的时候我又有几个选择, 利用LINQ to SQL可以执行自定义存储过程的功能, 完全自己写, LINQ to SQL本身已经有API提供了分页功能了,不过只有排序或包含标识列的查询中支持Skip方法, 我有什么理由放弃, 除非性能真的到了非常Critical的时候, 看看下面的分页API, 多么简单:

return q.Skip<Order>((currentPage - 1) * pageSize).Take< Order >(pageSize)

生成的T-SQL语句:

SELECT [t2].[OrderID], [t2].[OrderNumber], [t2].[OrderName], [t2].[DateSubmitted], [t2].[SubmittedBy], ([t2].[LastName] + @p2) + [t2].[FirstName] AS [SubmittedUserName]

FROM (

SELECT TOP (10) [t0].[OrderID], [t0].[OrderNumber], [t0].[OrderName], [t0].[SubmittedBy], [t0].[DateSubmitted], [t1].[FirstName], [t1].[LastName]

FROM [dbo].[Order] AS [t0]

INNER JOIN [dbo].[Users] AS [t1] ON [t1].[UserID] = [t0].[SubmittedBy]

WHERE ([t0].[NextProcessedBy] = @p0) AND ([t0].[CurrentState] = @p1)

) AS [t2]

– @p0: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [jlv]

– @p1: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [New]

– @p2: Input NVarChar (Size = 2; Prec = 0; Scale = 0) [, ]

DLINQ生成的SQL语句是利用TOP和嵌套子查询, 这种方法已经被证明是比较高效的做法(相比于临时表的做法), 所以完全有理由可以一试.到这里, List, IQueryable, IQueryable都没有任何问题.

3、需要一个动态排序功能, 这里List的局限性出来了, 传统的做法可能需要用一个dynamic参数来传递需要排序的列然后到SP当中来执行, 但我们已经不打算使用SP了, 也没有动态sql语句, 所有的东西都是强类型的, 然后有LINQ to SQL在运行时来帮我们转换为T-SQL语句。首先List的话, 我们不知道到底哪个字段要排序, 如果使用字符串作为参数的话, 例如放一个string sortBy作为方法的参数, 那么在方法体内就需要做if…else或者switch的判断, 而且还要考虑倒序还是正序的排序要求, 而且你还要hard code,很明显麻烦来了.然而如果使用IQueryable却可以很好的解决所有的这些问题.  但是IQueryable不能跨assembly, 一旦跨了assembly的话, 你无法使用var来引用匿名类里面的property, 绑定到control是没有问题的, 但是客户端的动态查询却成了问题, 因为你根本不知道匿名类是什么. 那么选择IQueryable<T>, 我们选择返回IQueryable<T>给客户端, 分页/排序都没有任何问题.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

数据库中间件 MyCAT源码分析——跨库两表Join

1. 概述 2. 主流程 3. ShareJoin 3.1 JoinParser 3.2 ShareJoin.processSQL(...) 3.3 Batc...

1.1K8
来自专栏雪胖纸的玩蛇日常

django orm 重点大全

2674
来自专栏禹都一只猫博客

Python的flask:models.py来创建mysql数据库

1K9
来自专栏Core Net

.Net cache与cache更新

3485
来自专栏程序员的SOD蜜

PDF.NET数据开发框架 之SQL-MAP使用存储过程

有关SQL-MAP的规范性介绍,请看下面的文章: PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范 在SQL-MAP中使用存储过程 1...

26210
来自专栏技术碎碎念

windows API 开发飞机订票系统 图形化界面 (四)

接下来的是录入航班、修改航班信息功能的实现: 1 //录入航班 2 BOOL EntryFlight(HWND hEntryDlg){ 3 4 ...

3185
来自专栏Java进阶之路

IK分词器访问远程词典功能实现

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最...

2582
来自专栏java系列博客

oracle 中start with ... connect by prior 子句的用法

1732
来自专栏yukong的小专栏

【ssm个人博客项目实战04】mybatis实现博客类别的增删改查分页

在前面一节我们已经完成后台管理界面的一个实现,在这一节我完成其中的博客类别管理中如果分页显示博客类别信息。

1585
来自专栏Java帮帮-微信公众号-技术文章全总结

Oracle应用实战八(完结)——存储过程、函数+对象曹组

游标 在写java程序中有结果集的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。 游标可以理解为是PL/S...

3526

扫码关注云+社区

领取腾讯云代金券