这样的多条件查询,大家会怎么优化?

ljsheng 2009-08-27 09:14:17
ViewState["sel"] = "";
if (name.Text.Trim() != "")
{
ViewState["sel"] += " a.Title like '%" + name.Text.Trim() + "%'";
}
else
{
ViewState["sel"] = " 1=1";
}
//时间不为空
if (StatTime.Text.Trim() != "" && EndTime.Text.Trim() != "")
{
ViewState["sel"] += " and a.AddDate >= '" + StatTime.Text + " 00:00:00' and a.AddDate <= '" + EndTime.Text + " 23:59:59" + "'";
}
else
{
//判断是否有一个时间
if (StatTime.Text.Trim() != "")
{
ViewState["sel"] += " and DATEDIFF(day,a.AddDate,'" + StatTime.Text + "')=0";
}
else if (EndTime.Text.Trim() != "")
{
ViewState["sel"] += " and DATEDIFF(day,a.AddDate,'" + EndTime.Text + "')=0";
}
else
{
}
}
if (flddl.SelectedValue != "0")
{
ViewState["sel"] += " and a.[Types] = " + flddl.SelectedValue + "";
}
SetFormInit();
}


谁有优化好的见解........如果是用参数传值的可以先不考虑的
...全文
162 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljsheng 2009-09-02
  • 打赏
  • 举报
回复


来结贴
海洋齐齐 2009-08-28
  • 打赏
  • 举报
回复
StringBuilder strSql = new StringBuilder();
strSql.Append();
ViewStates 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 loveljsheng 的回复:]
引用 8 楼 viewstates 的回复:
引用 5 楼 loveljsheng 的回复:
引用 2 楼 youjei 的回复:
写储存过程,最优化


这种语句到存储过程也只能字符串++++

这个不对吧?怎么不能放到存储过程中呢?
WHERE (NAME LIKE '%'+@NAME+'%' OR @NAME='')
AND ...


偶没说不能吧?偶说放进去也是只能用字符串相加...就像你写的一样..
[/Quote]
SQL中拼SQL语句也不是这样拼的。。。
DECLARE @STR VARCHAR(MAX)
SET @STR='SELECT * FROM TABLE'
EXEC(@STR)
这个才是拼字符串
qq175691524 2009-08-28
  • 打赏
  • 举报
回复
sql: like @keyword

c# code:sqlparkeyword.value = "'%"+keyword.Text+"%'";
qq175691524 2009-08-28
  • 打赏
  • 举报
回复
存储过程来吧!
ljsheng 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 viewstates 的回复:]
引用 5 楼 loveljsheng 的回复:
引用 2 楼 youjei 的回复:
写储存过程,最优化


这种语句到存储过程也只能字符串++++

这个不对吧?怎么不能放到存储过程中呢?
WHERE (NAME LIKE '%'+@NAME+'%' OR @NAME='')
AND ...
[/Quote]

偶没说不能吧?偶说放进去也是只能用字符串相加...就像你写的一样..
ViewStates 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 loveljsheng 的回复:]
引用 2 楼 youjei 的回复:
写储存过程,最优化


这种语句到存储过程也只能字符串++++
[/Quote]
这个不对吧?怎么不能放到存储过程中呢?
WHERE (NAME LIKE '%'+@NAME+'%' OR @NAME='')
AND ...
Hertz_liu 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zzxap 的回复:]
stringbuilder.appen("and .. ")
[/Quote]
支持,使用StringBuilder

using System.Text;
StringBuilder sb=new StringBuilder();
sb.Append("...");
或是sb.AppendFormat("...");
goodbetter_4107607 2009-08-27
  • 打赏
  • 举报
回复
我有个解决方案可以参考。
思路是定义一个统一接口,然后为每个条件生成类实现这个接口。
比如:定义一个接口
/// <summary>
/// 表示实现操作的Sql语句接口
/// </summary>
internal interface IOperationSql
{
/// <summary>
/// 取得操作对应的Sql语句
/// </summary>
/// <returns></returns>
string GetSql();

/// <summary>
/// 获取Sql语句使用的参数集合
/// </summary>
Collection<SqlParameter> Parameters { get; }
}

然后顶一个过程用接口组装Sql
string CreateSql(IOperationSql[] conditions)
{
string condtionSql=string.empty;
for (int n=0;n<conditions.Count;n++)
{
condtionSql=.....//依次掉用conditions的GetSql()并用and将其连接起来
}
string sql=string.empty;
sql+="select * from tableName where "+condtionSql;//组装成最终Sql
return sql;
}

然后对每个定义类并实现IOperationSql
如时间条件
class TimeCondition:IOperationSql
{
//构造函数传入时间值和逻辑运算符(>,=,<)等


public string GetSql()
{
//由传入的设定生成对应的Sql条件
}
}

这样在判断模块之需要判断用户没有输入即可,如果输入了就实例化对应条件的类并将其放入集合中,没有的话就忽略。最后调用CreateSql方法传入IOperationSql接口就可获得可执行的Sql。
这样做的好处是。1.增加了可重用性,比如时间条件一般需要输入开始和结束,用一个类就可以实现。如果需要重复上次查询,只需要将IOperationSql[]保存到Session中即可。
2.结构稳定,方便修改扩展。如果有新的条件加入,只需要定义新的类,并修改判断用户输入模块即可,其他模块都不受影响。有条件需要修改时,修改该条件的实现即可。

总的来说这个解决方案就是尽量实现模块的高聚合低耦合思路。
ljsheng 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 youjei 的回复:]
写储存过程,最优化
[/Quote]

这种语句到存储过程也只能字符串++++
ljsheng 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zzxap 的回复:]
stringbuilder.appen("and .. ")
[/Quote]



参数的不考虑
zhubo_1117 2009-08-27
  • 打赏
  • 举报
回复
Sql语句的优化具体要看查询分析器的执行效率分析了
飞一龙 2009-08-27
  • 打赏
  • 举报
回复
写储存过程,最优化
zzxap 2009-08-27
  • 打赏
  • 举报
回复
stringbuilder.appen("and .. ")

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧