C# ODataC日期间动态查询
我需要为odata创建一个动态查询, ?$filter=createDate+gt+2018-03-01T00:00:00%2B02:00+和+createDate+lt+2018-03-31T23:59:59%2B03:00 查询应过滤当月具有createDate的所有产品。 比如: $filter=createDate+gt+MonthFirstDaytoday+和+createDate+lt+MonthLastDaytoday 多谢各位C# ODataC日期间动态查询,c#,linq,odata,C#,Linq,Odata,我需要为odata创建一个动态查询, ?$filter=createDate+gt+2018-03-01T00:00:00%2B02:00+和+createDate+lt+2018-03-31T23:59:59%2B03:00 查询应过滤当月具有createDate的所有产品。 比如: $filter=createDate+gt+MonthFirstDaytoday+和+createDate+lt+MonthLastDaytoday 多谢各位 using System; using System
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.OData.Query;
namespace Business.BusinessLogic.Translators
{
/// <summary>
/// Convert odata query using keywords
/// </summary>
public class ODataQueryConverter : IODataQueryConverter
{
private readonly DateTime _serverNow = DateTime.UtcNow;
private Dictionary<string, string> KeywordsDictionary { get; set; }
/// <summary>
/// constructor
/// </summary>
public ODataQueryConverter()
{
KeywordsDictionary = new Dictionary<string, string>
{
{ "StartOfTheMonth", new DateTime(_serverNow.Year, _serverNow.Month, 1).ToString(Consts.IsoPattern)},
{ "EndOfTheMonth", new DateTime(_serverNow.Year, _serverNow.Month +1,1).AddSeconds(-1).ToString(Consts.IsoPattern)},
};
}
/// <summary>
/// Convert OData query option to new uri using const keywords
/// </summary>
/// <param name="odataQuery"></param>
/// <returns></returns>
public ODataQueryOptions Convert(ODataQueryOptions odataQuery)
{
if (odataQuery == null)
return null;
var odataRequestMessage = odataQuery.Request;
var odataRequestUri = odataRequestMessage.RequestUri.ToString();
var newRequestUriString = ConvertKeywords(odataRequestUri);
odataRequestMessage.RequestUri = new Uri(newRequestUriString);
var newOdataQueryOptions = new ODataQueryOptions(odataQuery.Context, odataRequestMessage);
return newOdataQueryOptions;
}
public string Convert(string odataQueryString)
{
return ConvertKeywords(odataQueryString);
}
private string ConvertKeywords(string odataRequestUri)
{
return KeywordsDictionary.Aggregate(odataRequestUri, (current, keyword) => current.Replace(keyword.Key, keyword.Value));
}
}
}
//method in my BaseODataController used to query data
//_converter is the instance of ODataQueryConverter that I got from depedency injection
public virtual IQueryable<T> Get(ODataQueryOptions<T> queryOptions)
{
var convertedQuery = _converter.Convert(queryOptions);
var queryable = BusinessController.Get();
var convertedQueryable = convertedQuery.ApplyTo(queryable);
return convertedQueryable;
}
现在,来自odata的每个请求都会经过转换器,并查找我们在转换器字典中设置的关键字。
如果转换器找到任何值,它将用相应的值替换它
现在我可以使用:
?$filter=dateTime+gt+StartOfTheMonth
它将自动转换为:
?$filter=dateTime+gt+2018-03-001T00:00:00.000Z
我们为关键字创建了一个真实来源,而不是让每个端点
翻译关键词本身
如果有人知道使用当前Odata版本的方法,请在此处发布。那么是什么阻止了您这样做?我需要动态查询,这意味着我需要它来查询当前月份的使用情况,而不是硬编码的。这可能会帮助您开始:所以使用字符串插值或类似的方法。你试过什么吗?如何进行此OData调用?保存后,我没有访问查询筛选器的权限,我在报告机制中使用查询,我需要查询是动态和独立的。