动态 linq,如何生成 LIKE 和 NOT LIKE
本文关键字:LIKE NOT 何生成 linq 动态 | 更新日期: 2023-09-27 18:35:45
在我的场景中,我必须根据用户在屏幕上选择的内容构建动态查询。
用户可以选择列名,然后选择运算符,然后键入值。
我已经为平等做了,但是喜欢和不喜欢的语法如何?所以
第一。我将列名称添加到我的列表中
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();
2nd.根据所选的列名称,我将运算符添加到下拉列表中。
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 + "'"");
}
- 我不知道的是如何连接/附加字符串以使"不等于"、"包含"和"不包含"以使用动态 linq 库
看起来动态 linq 的东西不支持"LIKE" - 但我想这就是你问这个问题的原因。我能想到的最好的办法是用类似的东西替换 LIKE(x>= y0 和 x <y1)。>
所以:
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);
}
即在搜索字符串的最后一个字符的值上加 1,并将其用作搜索的上限。
如果你知道你只处理简单的拉丁字符集,你可以让它稍微简单一点,然后使用:
string clause = string.Format("{0} >= '"{1}'" and {0} <= '"{1}z'"", DdlColumn1.SelectedValue, TxtValue1.Text);
但是,可能值得在此处查看谓词生成器,以获得更多类型安全性。
编辑
好吧,我从来没有!忘记这一切。
似乎您可以使用"myField.Contains(myCriteria)"和"myField.StartsWith(myCriteria)"来表示包含和类似
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);