Asp.net web api 与具有日期筛选器的OData一起使用时,RavenDB抛出日期时间错误

Asp.net web api 与具有日期筛选器的OData一起使用时,RavenDB抛出日期时间错误,asp.net-web-api,odata,ravendb,Asp.net Web Api,Odata,Ravendb,我正在一个.Net项目中工作,我正在使用Asp.NETWebAPI和OData查询嵌入式Raven数据库。我有一个单独的存储库项目,其中放置了RavenDB的东西,我正在我的WebAPI项目中访问这个存储库 下面是如何使用虚拟数据设置RavenDB存储库: public class EmployeeRepository { private static readonly Lazy<IDocumentStore> Store = new Lazy<

我正在一个.Net项目中工作,我正在使用Asp.NETWebAPI和OData查询嵌入式Raven数据库。我有一个单独的存储库项目,其中放置了RavenDB的东西,我正在我的WebAPI项目中访问这个存储库

下面是如何使用虚拟数据设置RavenDB存储库:

    public class EmployeeRepository
    {
        private static readonly Lazy<IDocumentStore> Store = new Lazy<IDocumentStore>(CreateInstance);

        public static IDocumentStore DocumentStore
        {
            get { return Store.Value; }
        }

        private static IDocumentStore CreateInstance()
        {
            var documentStore = new EmbeddableDocumentStore
            {
                DataDirectory = "Data",
                UseEmbeddedHttpServer = false,
                DefaultDatabase = "EmployeeDocumentDB"
            }.Initialize();

            using (var session = documentStore.OpenSession())
            {
                //TODO: Generates test data and can be deleted.
                PopulateEmployeesIfStoreIsEmpty(session);
            }

            return documentStore;
        }

        private static void PopulateEmployeesIfStoreIsEmpty(IDocumentSession session)
        {
            if (!session.Query<Employee>().Any())
            {
                var document1 = new Employee
                {
                    Id=1,
                    JoiningDate = new DateTime(2015, 01, 15),
                    BirthDate = new DateTime(1980, 01, 01)
                };

                var document2 = new Employee
                {
                    Id = 2,
                    JoiningDate = new DateTime(2015, 02, 15),
                    BirthDate = new DateTime(1985, 01, 01)
                };


                session.Store(document1);
                session.Store(document2);

                session.SaveChanges();
            }
        }

        public IQueryable<Employee> GetEmployees()
        {
            using (var session = DocumentStore.OpenSession())
            {
                return session.Query<Employee>();
            }
        }
    }
以下是ApicController的外观:

public class Employee
{
    public int Id { get; set; }
    public DateTime JoiningDate { get; set; }
    public DateTime BirthDate { get; set; }
}
public class EmployeeController : ApiController
{
    [HttpGet]
    [Route("employee/list")]
    public IHttpActionResult GetEmployees(ODataQueryOptions<Employee> options)
    {
        try
        {
            EmployeeRepository employeeRepository = new EmployeeRepository();
            var queryable = options.ApplyTo(employeeRepository.GetEmployees(), new ODataQuerySettings
            {
                EnableConstantParameterization = false,
                HandleNullPropagation = HandleNullPropagationOption.False
            });

            var employees = RetriveEmployeeListFromQueryable(queryable);

            return Ok(employees);
        }
        catch (Exception e)
        {
            return Content(HttpStatusCode.InternalServerError, e.Message);
        }
    }

    private List<Employee> RetriveEmployeeListFromQueryable(IQueryable queryable)
    {
        var employees = new List<Employee>();
        var enumerator = queryable.GetEnumerator();

        while (enumerator.MoveNext())
        {
            var employee = enumerator.Current as Employee;
            employees.Add(employee);
        }
        return employees;
    }
}
我得到一个错误声明:

无法理解如何翻译“IIF$it.JoiningDate.Kind==Utc或LSE$it.JoiningDate.Kind==Local,new DateTimeOffset$it.JoiningDate.ToUniversalTime.ToOffset-06:00:00,new DateTimeOffset$it.JoiningDate,”,UTC-06:00美国和加拿大中央时间。GetUtcOffset$it.JoiningDate.ToUniversalTime.ToOffset-06:00:00'到RavenDB查询。\\n您是否试图在查询期间进行计算?\\RavenDB不允许在查询期间进行计算,只允许在索引期间进行计算。考虑将操作移动到索引。


看起来OData正试图在JoiningDate属性中做一些Raven不喜欢的事情,但您显示的查询甚至没有这些。您确定这是完整的OData查询吗?或者您正在控制器中进一步操作它?请显示控制器的该部分。打电话给GetEmployees的部分。嗨,Matt,我已经用您要求的详细信息更新了问题,如果您需要任何其他信息,请提前告诉我。这不是Raven问题,而是与OData v4不支持日期时间支持、支持日期时间偏移有关。事实证明,这是一个不受欢迎的决定,在OData v5中被列入了逆转的议程。我会看看是否能为Raven找到一个解决方案,并在第二天或第二天发布答案。顺便说一句,您的RetrieveEmployeeListFromQueryable是不必要的。Just cast-var queryable=IQueryable选项。ApplyTo。。。然后你可以打电话给托利斯,那太好了!谢谢你,马特。
http://localhost/employee/list?$filter=BirthDate eq 1985-01-01