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.同样的错误以不同的格式。 –