在数据层中的有一字段如:ID,我想根据条件执行相应的查询如:ID=100,id>100,或者NAME="P" NAME LIKE %P%之类的条件,
在UI层我是传了一个实体到BLL再到DAL中的,再根据实体生成查询字符串。现在我想“=”,“》”,“LIKE"等复杂条件是如何传递到数据访问题的?请问有什么更好的方法解决这个问题。谢谢
谢谢各位的答案,但是一个字段是可以解决这个问题,但是我的条件可能是多个字段组成的,又不是所以字段都是必需的查询条件。有没有更好的解决方案。谢谢
如public class pClass{int id,string name}
GetbyIDDAL(pClass p)
{
if(p.id>0)
{
//问题在这里。我想知道如何根据UI层的条件选择大于还是等于。
sql+="ID>"+p.id
//sql+="ID="+p.id}
}
UI层:
pClass pp=new pClass();
pp.id=100;
GetByIDUI(pp);
我现在的做法大概是这样思路,难道要传SQL(" WHERE ID>100"或 "where Name like %q%"之类的)?
1,你可以直接传一个字符串"id=100"这样的到DAL层,
2,你可以传个实体,包含“id”,100,和查询的类型等信息,在DAL层你自动组装。查询的类型就是=,>,like等。你你上面的代码,你先加一个枚举,pClass类中你再加一个string type属性,或别用string用枚举,然后传值的时候你就能知道怎么选择是大于还是等于了。
if(p.id>0)
{
sql+="ID"+type+p.id;
}
传个查询类型是可以。但是实体可能会有很多个字段。各个字段可能会组成不同的查询条件,就是这个查询类型怎么和实段对应呢?谢谢
而且不是每个字段都必需有查询条件的。
@苍龙95: 你还是直接拼好条件再传入吧。比如:
GetbyIDDAL(string strWhere)
{
if(strWhere!=null&&strWhere!="")
{
sql+="where "+strWhere;
//问题在这里。我想知道如何根据UI层的条件选择大于还是等于。
// sql+="ID>"+p.id
//sql+="ID="+p.id}
}
}
UI层:
GetByIDUI("id>100");
或
GetByIdUI("");
@LCM: 拼SQL是可以,很简单。但是大家都UI层不要SQL,所以很麻烦。
@苍龙95: 你说的不是每个字段都有查询条件,是什么意思?拼字符串的话,你随便有多少个字段有多少查询条件都可以的啊,假如没有的话就传入空值,有多个的话把多个条件用and 或or连接起来就行了。
@LCM: 拼字符串我知道怎么做,我是说如果加类型的话,一个实体有多个字段,如class p {int id,string naem,....}
我传到数据层的实体如ID,可能有“=”,“>","<", ">"等,但是有可能NAME等也要在查询中。这时候这个类型和字段就对应不上了。
@苍龙95:
@苍龙95: 另外,你可以这样
public class pClass{string feildName,string fieldValue,string type}
GetbyIDDAL(List<pClass> listFilter)
{
if(listFilter!=null&&listFilter.Count>0)
{
//没有拼接前的sql语句应该是这样的 select * from table where 1=1
foreach(string filter in listFilter)
{
//这里还可以判断一下是like的特殊情况不是下面这样拼sql的,需要加%
sql+= “ and ” +filter.feildName+type ="'"+fieldValue+"'";
}
}
UI层:这样你就可以按很多的条件进行拼接了,随便多少条件都行
GetByIDUI(list);
@LCM: 呵呵。这样是可以,但总觉得和传SQL字符串差不多,不知道你在项目中如果有这种复杂查询是传SQL还是怎么做的?
@苍龙95: 传sql查询条件的比较多,方便些。比如传一个 “id<100 and name like 'lcm%' ",但这一般是从BLL层向DAL层传,而UI层只传100和lcm到BLL层,然后调用BLL层相应的方法。
@LCM: 谢谢了。看来只能在传SQL了。。呵呵
在你的方法上加一个类型控制,
if(type==1){ID=100}
else (type==2){id>100}...