动态linq,如何生成LIKE和NOT LIKE [英] Dynamic linq, how to generate LIKE and NOT LIKE
问题描述
在我的场景中,我必须根据用户在屏幕上选择的内容构建一个动态查询。
用户可以选择列名,然后选择一个运算符键入一个值。
我已经做到了这一点,但是如何将是LIKE和NOT LIKE的语法?
so
1st。将列名添加到列表中
var columns = new Dictionary< string,string>
{
{CurrentStatus,当前状态},
{RequestNumber,请求号码},
{RequestDate,请求日期
{IsOnHold,保留},
{BrandReturnedVehicle,Brand Returned Vehicle},
{TypeReturnedVehicle,Type Returned Vehicle},
{ChassisReturnedVehicle,Chassis Returned Vehicle},
{DestructionCertificateNumberReturnedVehicle,
Destruction Certificate Number Returned Vehicle},
{AmmountWithVAT,Ammount WithVAT} ,
{AmmountWithoutVat,Ammount Without Vat},
{Percentages,Percentage},
{VehicleDestructionDate,Vehicle Destruction Date b {评论,评论},
{鉴别者,请求类型},
};
DdlColumn1.DataSource = columns;
DdlColumn1.DataTextField =Value;
DdlColumn1.DataValueField =Key;
DdlColumn1.DataBind();
第二。根据所选列名,我将操作符添加到下拉列表中。
protected void DdlColumn1SelectedIndexChanged(object sender, EventArgs e)
{
LoadOperatorsDependingOnColumn(发件人为DropDownList,DdlColumn1.SelectedValue);
private void LoadOperatorsDependingOnColumn(DropDownList ddlOperators,string columnname)
{
var operators = new Dictionary< string,string>();
operators.Clear();
switch(columnname)
{
caseCurrentStatus:
AddTextOperatorsToList(operators);
ddlOperators.DataSource =运算符;
ddlOperators.DataTextField =Value;
ddlOperators.DataValueField =Key;
ddlOperators.DataBind();
break;
caseAmmountWithVat:
AddNumberOperatorsToList(operators);
break;
}
private static void AddTextOperatorsToList(Dictionary< string,string>运算符)
{
operators.Add(= =,等于);
operators.Add(<>,不等于);
operators.Add(LIKE,Contains);
operators.Add(NOT LIKE,不包含);
}
private static void AddNumberOperatorsToList(Dictionary< string,string>运算符)
{
operators.Add(=,Equals);
operators.Add(<>,不等于);
operators.Add(>,大于);
operators.Add(> =,大于或等于);
operators.Add(<,小于);
operators.Add(< =,小于或等于);
}
private string ColumnType(string columnName)
{
switch(columnName)
{
caseCurrentStatus:
返回文本;
break;
caseRequestNumber:
returnText;
break;
}
}
私有字符串BuildQuery()
{
var sb = new StringBuilder();
// var list = RequestBaseBL.GetRequestByCustomQuery(RequestNumber == \12\);
if(ColumnType(DdlColumn1.SelectedValue)==Text&& DdlOperator1.SelectedItem.Text ====)
{
sb.Append DdlColumn1.SelectedValue);
sb.Append(DdlOperator1.SelectedValue);
sb.Append(\+ TxtValue1.Text +\);
}
- 我不知道的是如何连接/附加字符串使不平等,包含并且不包含使用动态linq库。
看起来动态linq的东西不支持LIKE - 但我想这就是为什么你问这个问题。最好的办法就是用(x> = y0 AND x< y1)这样的东西代替LIKE。_
so:
if(ColumnType(DdlColumn1.SelectedValue)==Text&& DdlOperator1.SelectedItem.Text ==LIKE)
{
string s = TxtValue1.Text;
Char c = s [s.Length - 1];
string s1 = s.Substring(0,s.Length - 1)+((Char)(c + 1));
string clause = string.Format({0}> = \{1} \和{0}< \{2} \,DdlColumn1.SelectedValue, S1);
sb.Append(clause);
}
ie添加1到搜索字符串的最后一个字符的值,并使用作为搜索的上限。
如果你知道你只是处理简单的拉丁字符集,你可以使它稍微简单一些,并使用:
string clause = string.Format({0}> = \{1} \和{0}< = \{1} z\\ \\,DdlColumn1.SelectedValue,TxtValue1.Text);
但是,请注意 我从来没有!忘记所有这些。 似乎你可以使用myField.Contains(myCriteria)和myField.StartsWith(myCriteria)为CONTAINS和LIKE 和 ,对于NOT LIKE: In my scenario I have to build a dynamic query based on what the user selects on the screen. The user can select a columnname, then an operator and then type a value. I already did it for the equal, but how it would be the syntax for the LIKE and NOT LIKE?
so 1st. I add the Column names to my list 2nd. Depending on the selected column name, I add the operators to the dropdownlist.
It would appear that the dynamic linq stuff doesn't support 'LIKE' - but I guess that's why you're asking the question. The best I could come up with is to replace LIKE with something like (x >= y0 AND x < y1). ie Add 1 to the value of the last character of the search string and use that as an upper bound for the search. But it might be worth taking a look at the predicate builder here to get more type safety. EDIT Well I never! Forget all that. It seems you can use "myField.Contains(myCriteria)" and "myField.StartsWith(myCriteria)" for CONTAINS and LIKE and and, for NOT LIKE:
这篇关于动态linq,如何生成LIKE和NOT LIKE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
$ b
sb.Append(string.Format({0} .Contains(\{1} \),DdlColumn1.SelectedValue, TxtValue1.Text);
sb.Append(string.Format({0} .StartsWith(\{1} \),DdlColumn1.SelectedValue,TxtValue1.Text);
sb.Append(string.Format(!{0} .StartsWith(\{1} \),DdlColumn1.SelectedValue,TxtValue1.Text);
var columns = new Dictionary<string, string>
{
{"CurrentStatus", "Current Status"},
{"RequestNumber", "Request Number"},
{"RequestDate", "Request Date"},
{"IsOnHold", "Is On Hold"},
{"BrandReturnedVehicle", "Brand Returned Vehicle"},
{"TypeReturnedVehicle", "Type Returned Vehicle"},
{"ChassisReturnedVehicle", "Chassis Returned Vehicle"},
{"DestructionCertificateNumberReturnedVehicle",
"Destruction Certificate Number Returned Vehicle"},
{"AmmountWithVAT", "Ammount WithVAT "},
{"AmmountWithoutVat", "Ammount Without Vat"},
{"Percentage", "Percentage"},
{"VehicleDestructionDate", "Vehicle Destruction Date"},
{"Comments", "Comments"},
{"Discriminator", "Request Type"},
};
DdlColumn1.DataSource = columns;
DdlColumn1.DataTextField = "Value";
DdlColumn1.DataValueField = "Key";
DdlColumn1.DataBind();
protected void DdlColumn1SelectedIndexChanged(object sender, EventArgs e)
{
LoadOperatorsDependingOnColumn(sender as DropDownList, DdlColumn1.SelectedValue);
}
private void LoadOperatorsDependingOnColumn(DropDownList ddlOperators, string columnname)
{
var operators = new Dictionary<string, string>();
operators.Clear();
switch (columnname)
{
case "CurrentStatus":
AddTextOperatorsToList(operators);
ddlOperators.DataSource = operators;
ddlOperators.DataTextField = "Value";
ddlOperators.DataValueField = "Key";
ddlOperators.DataBind();
break;
case "AmmountWithVat":
AddNumberOperatorsToList(operators);
break;
}
}
private static void AddTextOperatorsToList(Dictionary<string, string> operators)
{
operators.Add("==", "Equals");
operators.Add("<>", "Not Equals");
operators.Add("LIKE", "Contains");
operators.Add("NOT LIKE", "Does not Contain");
}
private static void AddNumberOperatorsToList(Dictionary<string, string> operators)
{
operators.Add("=", "Equals");
operators.Add("<>", "Not Equals");
operators.Add(">", "Greater than");
operators.Add(">=", "Greater or equal than");
operators.Add("<", "Less than");
operators.Add("<=", "Less or equal than");
}
private string ColumnType(string columnName)
{
switch (columnName)
{
case "CurrentStatus":
return "Text";
break;
case "RequestNumber":
return "Text";
break;
}
}
private string BuildQuery()
{
var sb = new StringBuilder();
//var list = RequestBaseBL.GetRequestByCustomQuery("RequestNumber == \"12\"");
if (ColumnType(DdlColumn1.SelectedValue) == "Text" && DdlOperator1.SelectedItem.Text=="==")
{
sb.Append(DdlColumn1.SelectedValue);
sb.Append(DdlOperator1.SelectedValue);
sb.Append("\"" + TxtValue1.Text + "\"");
}
So:if (ColumnType(DdlColumn1.SelectedValue) == "Text" && DdlOperator1.SelectedItem.Text=="LIKE")
{
string s = TxtValue1.Text;
Char c = s[s.Length - 1];
string s1 = s.Substring(0, s.Length - 1) + ((Char)(c + 1));
string clause = string.Format("{0} >= \"{1}\" and {0} < \"{2}\"", DdlColumn1.SelectedValue, s, s1);
sb.Append(clause);
}
If you know you're only dealing with simple Latin charactersets you could make it slightly simpler and use:string clause = string.Format("{0} >= \"{1}\" and {0} <= \"{1}z\"", DdlColumn1.SelectedValue, TxtValue1.Text);
sb.Append(string.Format("{0}.Contains(\"{1}\")", DdlColumn1.SelectedValue, TxtValue1.Text);
sb.Append(string.Format("{0}.StartsWith(\"{1}\")", DdlColumn1.SelectedValue, TxtValue1.Text);
sb.Append(string.Format("!{0}.StartsWith(\"{1}\")", DdlColumn1.SelectedValue, TxtValue1.Text);