2

動的 linq ライブラリを使用して動的クエリ ビルダーを構築しています。これまでのところ、ブール値、数値、テキストでは問題なく動作しますが、日付では機能しません。

日付が正常に機能するには、どのような形式が必要なのだろうか。

これは、sb.ToString が返すものを実行するコードです。

private string BuildQuery()
        {
            var sb = new StringBuilder();
            //var list = RequestBaseBL.GetRequestByCustomQuery("RequestNumber == \"12\"");
        #region 1st ROW of the QUERY
        if (ColumnType(DdlColumn1.SelectedValue) == "Text")
        {
            if(DdlOperator1.SelectedValue == "==")
            {
                sb.Append(DdlColumn1.SelectedValue);
                sb.Append(DdlOperator1.SelectedValue);
                sb.Append("\"" + TxtValue1.Text + "\"");
            }
            if (DdlOperator1.SelectedValue == "<>")
            {
                sb.Append(DdlColumn1.SelectedValue);
                sb.Append(DdlOperator1.SelectedValue);
                sb.Append("\"" + TxtValue1.Text + "\"");
            }
            if (DdlOperator1.SelectedValue == "LIKE")
            {
                sb.Append(string.Format("{0}.Contains(\"{1}\")", DdlColumn1.SelectedValue, TxtValue1.Text));
            }
            if (DdlOperator1.SelectedValue == "NOT LIKE")
            {
                sb.Append(string.Format("!{0}.Contains(\"{1}\")", DdlColumn1.SelectedValue, TxtValue1.Text));
            }
        }

        if (ColumnType(DdlColumn1.SelectedValue) == "Number")
        {
            sb.Append(DdlColumn1.SelectedValue);
            sb.Append(DdlOperator1.SelectedValue);
            sb.Append(TxtValue1.Text);
        }

        if (ColumnType(DdlColumn1.SelectedValue) == "Date")
        {
            sb.Append(DdlColumn1.SelectedValue);
            sb.Append(DdlOperator1.SelectedValue);
            sb.Append(TxtValue1.Text);
        }

        if (ColumnType(DdlColumn1.SelectedValue) == "Bool")
        {
            sb.Append(DdlColumn1.SelectedValue);
            sb.Append(DdlOperator1.SelectedValue);
            sb.Append(TxtValue1.Text);
        }

        #endregion  


        return sb.ToString();
    }


  string strSql = BuildQuery();
            try
            {
                var list = RequestBaseBL.GetRequestByCustomQuery(strSql, DdlRequestType.SelectedValue).ToList();



private static void AddDateOperatorsToList(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");
            }

更新 1:

エラー: 演算子 '=' は、オペランドの型 'DateTime' および 'Int32' と互換性がありません

sb.toString()

? sb.ToString() "RequestDate=12/12/2015"

更新 2:

アップデート 2 のエラー:

タイプ 'DateTime' に適用可能なメソッド 'Parse' が存在しません

if (ColumnType(DdlColumn1.SelectedValue) == "Date")
                {
                    sb.AppendFormat("DateTime.Parse({0})", DdlColumn1.SelectedValue);
                    var str = string.Format("{0} {1} {2}", DdlColumn1.SelectedValue, DdlOperator1.SelectedValue,
                                               DateTime.Parse(TxtValue1.Text));
                    //sb.Append(DdlColumn1.SelectedValue);
                    //sb.Append(DdlOperator1.SelectedValue);
                    //sb.Append(TxtValue1.Text);
                    sb.Append(str);
                }

更新 3:

どちらも機能しませんでした

if (ColumnType(DdlColumn1.SelectedValue) == "Date")
                {
                    var date = DateTime.Parse(TxtValue1.Text);
                    sb.Append(DdlColumn1.SelectedValue);
                    sb.Append(DdlOperator1.SelectedValue);
                    sb.Append("\"" + date.ToUniversalTime() + "\"");
                    //sb.Append(date.ToUniversalTime());
                }

ここに画像の説明を入力

4

1 に答える 1

1

私は現在 System.Dynamic.Linq を使用しており、DateTime オブジェクトで double equals を使用しています。

case "Equals":
    myDictionary.Add("MyField.Date ==", dt1);
    break;

後で、辞書のキーを文字列に、値を配列に変換します (@ 記号の使用に注意してください)。

if (myDictionary.Keys.Count > 0)
{
  var conditions = myDictionary.Keys.Select((key, idx) => string.Format("{0} (@{1})", key, idx));

  // in .NET 4, the ToArray() part can go away
  predicateString = string.Join(" and ", conditions.ToArray());
  predicateValues = myDictionary.Values.ToArray();
}

次に、AsQueryable().Where() を呼び出します。

return myList.AsQueryable().Where(predicateString, predicateValues).ToList();

このようにすることで、DateTime オブジェクトを文字列として扱う必要がなくなると思います。

于 2012-06-01T12:03:30.357 に答える