0

私のシナリオでは、ユーザーが画面上で選択したものに基づいて動的クエリを作成する必要があります。

ユーザーは、列名を選択してから演算子を選択し、値を入力できます。

私はすでに同等のことをしましたが、LIKEとNOT LIKEの構文はどうなるでしょうか?それで

1日 リストに列名を追加します

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();

2位。選択した列名に応じて、ドロップダウンリストに演算子を追加します。

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 librayで機能するように、等しくない、含む、含まないを作成する方法です。
4

1 に答える 1

2

動的なlinqのものは「LIKE」をサポートしていないように見えますが、それがあなたが質問している理由だと思います。私が思いつくことができる最善の方法は、LIKEを(x> = y0 AND 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);

しかし、型の安全性を高めるために、ここで述語ビルダーを調べる価値があるかもしれません。

編集

まあ私は決して!それをすべて忘れてください。

CONTAINSとLIKEには「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);

そして、NOT LIKEの場合:

sb.Append(string.Format("!{0}.StartsWith(\"{1}\")", DdlColumn1.SelectedValue, TxtValue1.Text);
于 2012-05-31T08:25:38.333 に答える