动态Linq where语句,比较日期为字符串

时间:2016-12-29 21:35:20

标签: c# linq

我需要构建一个动态的where语句,但我仍然坚持将DateTime转换为字符串。请查看我的代码并建议如何将DateTime类型与字符串进行比较。

foreach (var f in filter.filters)
{
    if (f.Key.ToLower().Contains("date") || f.Key.ToLower().Contains("time"))
    {
        queryWhere += "CONVERT(VARCHAR(25)," + f.Key + ",126).Contains(\"" + f.Value + "\") AND ";
    }
    else
    {
        queryWhere += f.Key + ".Contains(\"" + f.Value + "\") AND ";
    }
}

return queryWhere = queryWhere.Remove(queryWhere.Length - 5);

Filter对象的定义:

public class Filter
{
    public string orderby { get; set; } = "Id";
    public Dictionary<string, string> filters { get; set; }
}

在JSON中过滤对象

{
   "orderby": "Id",
"filters": {
    "Status": "OK",
    "CreateDate" : "2016-02"
},}

var query的内容:

"Status.Contains(\"OK\") AND CONVERT(VARCHAR(25),CreateDate,126).Contains(\"2016-02\")"

ParseException错误:

  

System.Linq.Dynamic.Core.dll中出现类型为“System.Linq.Dynamic.Core.Exceptions.ParseException”的异常但未在用户代码中处理附加信息:类型中不存在适用的方法“VARCHAR” 'ServersViewModel'

我已从CONVERT()更改为.ToString()但我已获得警告

queryWhere += f.Key + ".ToString().Contains(\"" + f.Value + "\") AND ";
  

警告:Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationCont extFactory[8]      LINQ表达式'[srv].CreateDate.ToString().Contains("2016-02")'可以      不予翻译,将在当地进行评估。要配置此警告,请使用DbContextOptionsBuilder.ConfigureWarnings API(事件ID“RelationalEventId.QueryClientEvaluationWarning”)。重写DbContext.OnConfiguring方法或在应用程序服务提供程序上使用AddDbContext时,可以使用ConfigureWarnings。

任何想法?

0 个答案:

没有答案