1

我正在使用動態linq庫構建一個動態查詢生成器。 到目前爲止,它的工作正常與布爾,數字和文字,但與日期。帶日期字段的動態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:

錯誤是: 操作 '=' 與操作數類型的 '日期時間' 和 '的Int32'

的sb.toString()

不相容? sb.ToString() 「RequestDate = 12/12/2015」

更新2:

更新2的錯誤:

'解析' 在類型 '日期時間'

存在沒有適用的方法
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:

沒有工作eith呃

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

enter image description here

+0

請定義「不工作」。錯誤?或意外的結果? –

+0

你可以發佈什麼sb.ToString()返回?另外,你添加的小小圖片是不可讀的。 –

+0

請參閱更新1. –

回答

0

我目前使用System.Dynamic.Linq和使用雙等於一個DateTime對象。

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已(),其中()

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

我相信這樣做不需要將DateTime對象作爲字符串處理。

+0

現在說:沒有適用的方法'Parse'存在於'DateTime'類型中。 sb.ToString是: –

+0

記住它的動態linq庫,所以它可能會有所不同,也許 –

+0

也請參見更新2.同樣的錯誤以不同的格式。 –