动态 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 + "'"");
                }
  1. 我不知道的是如何连接/附加字符串以使"不等于"、"包含"和"不包含"以使用动态 linq 库

动态 linq,如何生成 LIKE 和 NOT LIKE

看起来动态 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);