这就是我正在努力回到网络开发世界
ASP.Net与VS2008
亚音速作为数据访问层
SqlServer DB
首页项目描述: 我有一个学生注册系统。我有一个网页,应该显示学生记录。
目前我有一个显示记录的gridview控件
用户登录并进入查看学生页面。 gridview显示系统中的学生,其中一列是打开,待定,完成的注册状态。
我希望用户能够对返回的结果应用动态排序或过滤器,以获得他们希望看到的更精细的结果。我设想允许用户通过在子数据方法的数据集接口上对返回的结果应用where子句或like子句来过滤结果。我不想再次查询数据库以应用过滤器
示例:初始查询
Select * from studentrecords where date = convert(varchar(32,getdate(),101)
然后,用户应该可以对返回的结果集进行过滤,以便他们可以使用'%Souza%'这样的姓氏
这是否可能,并且将数据源绑定到gridview控件的最佳方法,还是应该创建一个继承自collectionbase的自定义集合,然后将其绑定到gridview控件?
PS:抱歉打字错误了。我的机器受到我的笔记本电脑上的茶叶溢出的影响答案 0 :(得分:1)
我使用LINQ-to-SQL,而不是Subsonic,所以YMMV,但我的过滤方法是为数据源提供OnSelecting处理程序。在LINQ-to-SQL中,我能够使用对DataContext方法的引用替换结果,该方法返回应用表值函数的结果。您可能想要调查类似于Subsonic的内容。
答案 1 :(得分:1)
正如tvanfosson所说,LINQ非常适合制作可组合查询;您可以使用基本库生成的完全dunamic TSQL,或通过在数据上下文中使用[FunctionAttribute(...,IsComposable = true)]标记的UDF来执行此操作。
我不熟悉亚力士,所以我不能在那里提供建议;但另一个想法是:在你的“date =”代码中,你可以考虑声明一个datetime变量并首先分配它......这样优化器通常可以更好地优化它(查询更简单,没有询问它是将日期时间(每行)转换为varchar,还是将varchar转换为日期时间。获得某事物的日期部分的最有效方法是施放/地板/施法:
SET @today = GETDATE()
SET @today = CAST(FLOOR(CAST(@today as float)) as datetime)
[更新评论]
可组合 - 我的意思是,这允许您构建一个查询,以便只在数据库中执行 final 查询。例如:
var query = from row in ctx.SomeComplexUdf(someArg)
where row.IsOpen && row.Value > 0
select row;
可能会通过TSQL进入服务器:
SELECT u1.*
FROM dbo.SomeComplexUdf(@p1) u1
WHERE u1.IsOpen = 1 -- might end up parameterized
AND u1.Value > 0 -- might end up parameterized
这里的重点是只从服务器返回合适的数据,而不是返回大量数据,然后扔掉。 LINQ-to-SQL可以通过可复制的查询来执行各种操作,包括分页,排序等。通过最小化从数据库加载的数据量,可以显着提高性能。
没有可组合性的替代方案是它只是:
SELECT u1.*
FROM dbo.SomeComplexUdf(@p1) u1
然后丢弃你的网络应用程序中的其他行...显然,如果你期望20个开放记录和10000个已关闭的记录,这是一个巨大的差异。
答案 2 :(得分:0)
这样的事情怎么样?
而不是将数据源/表分配给网格控件,而是将“DataView”附加到其中。
这是一种伪代码示例:
DataTable myDataTable = GetDataTableFromSomewhere();
DataGridView dgv = new DataGridView();
DataView dv = new DataView(myDataTable);
//Then you can specify things like:
dv.Sort = "StudentStatus DESC";
dv.Filter = "StudentName LIKE '" + searchName + '";
dgv.DataSource = dv;
......等等。