Asp.net web api 与具有日期筛选器的OData一起使用时,RavenDB抛出日期时间错误
我正在一个.Net项目中工作,我正在使用Asp.NETWebAPI和OData查询嵌入式Raven数据库。我有一个单独的存储库项目,其中放置了RavenDB的东西,我正在我的WebAPI项目中访问这个存储库 下面是如何使用虚拟数据设置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<
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