此代码已针对此示例进行了简化。
查询实际上是从服务返回的,这就是为什么我更愿意以这种方式编写方法的原因。
[HttpGet]
public PageResult<ExceptionLog> Logging(ODataQueryOptions<ExceptionLog> options)
{
var query = from o in _exceptionLoggingService.entities.ExceptionDatas
select new ExceptionLog {
ExceptionDataId = o.ExceptionDataId,
SiteId = o.SiteId,
ExceptionDateTime = o.ExceptionDateTime,
StatusCode = o.StatusCode,
Url = o.Url,
ExceptionType = o.ExceptionType,
ExceptionMessage = o.ExceptionMessage,
Exception = o.Exception,
RequestData = o.RequestData
};
var results = options.ApplyTo(query) as IEnumerable<ExceptionLog>;
var count = results.LongCount();
return new PageResult<ExceptionLog>(results, Request.GetNextPageLink(), count);
}
“results.LongCount()”上的上述代码错误,带有以下异常:
SqlException: The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.
看来我在尝试分页时遇到了异常,例如“$ top = 2”。如果我的查询字符串是这样的“$filter=ExceptionDataId gt 100”,一切正常。
由于 ExceptionData (实体)匹配 ExceptionLog (业务模型),我可以做这样的事情作为一种解决方法:
[HttpGet]
public PageResult<ExceptionLog> Logging(ODataQueryOptions<ExceptionData> options)
{
var query = from o in _exceptionLoggingService.entities.ExceptionDatas
orderby o.ExceptionDateTime descending
select o;
var results = from o in options.ApplyTo(query) as IEnumerable<ExceptionData>
select new ExceptionLog {
ExceptionDataId = o.ExceptionDataId,
SiteId = o.SiteId,
ExceptionDateTime = o.ExceptionDateTime,
StatusCode = o.StatusCode,
Url = o.Url,
ExceptionType = o.ExceptionType,
ExceptionMessage = o.ExceptionMessage,
Exception = o.Exception,
RequestData = o.RequestData
};
return new PageResult<ExceptionLog>(results, Request.GetNextPageLink(), results.LongCount());
}
但这对我来说并不完全有效,因为它有点老套,我不能使用已经给我一个 IQueryable 的服务方法。
另外需要注意的是,如果将 Logging 方法转换为 IQueryable,则一切正常。但是我需要用查询返回计数,所以我必须返回一个 PageResult。