Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ODataC日期间动态查询_C#_Linq_Odata - Fatal编程技术网

C# ODataC日期间动态查询

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

我需要为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.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调用?保存后,我没有访问查询筛选器的权限,我在报告机制中使用查询,我需要查询是动态和独立的。