我们有一个SQL服务器视图,其中包含一些XML字段。 我们首先使用Entity Framework(v5)数据库创建了一个DBContext。 我们添加了一个WCF数据服务并将其分配给DBContext,如:
public class ProductsDBSvc : DataService<ProductsDBEntities>
{
config.UseVerboseErrors = true;
config.SetEntitySetPageSize("vw_Release", 100);
config.SetEntitySetAccessRule("vw_Release", EntitySetRights.AllRead);
}
使用浏览器我们拨打此电话http://localhost:60606/Products/vw_Release,但会返回以下错误:
<m:internalexception>
<m:message>
The XML data type cannot be compared or sorted, except when using the IS NULL operator.
</m:message>
<m:type>System.Data.SqlClient.SqlException</m:type>
<m:stacktrace>
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
</m:stacktrace>
</m:internalexception>
错误意味着我们不能在order by子句中使用XML列,这是SQL Server错误。 虽然我们从未在查询中要求订单。
所以我们激活了SQL Profiler,我们发现了以下信息: 1- OData WCF服务与实体框架引用视图(而不是表)发送一个SQL语句,其中包括每个列的order by,如下所示:
SELECT
[vw_Release].[ID] AS [ID],
[vw_Release].[TypeNameXml] AS [TypeNameXml],
[vw_Release].[StatusNameXml] AS [StatusNameXml],
[vw_Release].[Created] AS [Created],
[vw_Release].[Modified] AS [Modified],
FROM [dbo].[vw_Release] AS [vw_Release]) AS [Extent1]
) AS [Project1]
ORDER BY [Project1].[Created] ASC,
[Project1].[ID] ASC, [Project1].[Modified] ASC,
[Project1].[StatusNameXml] ASC, [Project1].[TypeNameXml] ASC
2-获取相同的信息但只是从表而不是视图中读取发送:
SELECT
[Release].[ID] AS [ID],
[Release].[TypeNameXml] AS [TypeNameXml],
[Release].[StatusNameXml] AS [StatusNameXml],
[Release].[Created] AS [Created],
[Release].[Modified] AS [Modified],
FROM [dbo].[Release] AS [vw_Release]) AS [Extent1]
ORDER BY [Project1].[Created] ASC,
[Extent1].[ID] ASC
我们所做的一切都是开箱即用的功能,并且可以轻松复制。有没有办法告诉WCF数据服务不要为所有列包含order by?
答案 0 :(得分:0)
我认为这个问题与Config.SetEntityPage大小有关,你可以尝试不设置它,看看会发生什么。
Problem with WCF Data Service (OData), SetEntitySetPageSize and custom operations