无法使用Queryable(PageSize = 1)属性检索xml列

时间:2013-04-02 20:59:04

标签: c# asp.net-mvc-4 asp.net-web-api entity-framework-5 odata

我正在尝试使用带有ASP.NET Web API的OData通过Entity Framework从SQL Server检索行。当其中一列是xml类型时遇到问题。如果我使用以下控制器中的[Queryable]返回整个集合,则没有问题:

public class TradesController : ODataController
{
    private readonly HermesContext _db = new HermesContext();

    [Queryable]
    public IQueryable<Trade> GetTrades()
    {
        return _db.trades;
    }
}

但是当我对我的操作使用[Queryable(PageSize = 1)]时,我收到以下错误:

The XML data type cannot be compared or sorted, except when using the IS NULL operator.

这是因为实体框架生成的sql(通过分析器查看)是:

SELECT 
[Extent1].[trade_reference] AS [trade_reference], 
[Extent1].[trade_id] AS [trade_id], 
[Extent1].[last_updated] AS [last_updated], 
[Extent1].[client_application_code] AS [client_application_code], 
[Extent1].[trade_markup] AS [trade_markup]
FROM [dbo].[Trade] AS [Extent1]
ORDER BY [Extent1].[client_application_code] ASC, [Extent1].[last_updated] ASC,     [Extent1].[trade_id] ASC, [Extent1].[trade_markup] ASC, [Extent1].[trade_reference] ASC

[trade_markup]是一个xml类型,它包含在ORDER BY子句中导致错误。如果我删除&#39; [Extent1]。[trade_markup] ASC&#39;,并运行sql的其余部分(手动),它执行正常。

贸易映射是:

public class tradeMap : EntityTypeConfiguration<Trade>
{
    public tradeMap()
    {
        // Primary Key
        this.HasKey(t => t.trade_reference);

        // Properties
        this.Property(t => t.trade_id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        this.Property(t => t.trade_reference)
            .IsRequired()
            .IsFixedLength()
            .HasMaxLength(50);

        this.Property(t => t.client_application_code)
            .IsRequired()
            .IsFixedLength()
            .HasMaxLength(10);

        // Table & Column Mappings
        this.ToTable("Trade");
        this.Property(t => t.trade_id).HasColumnName("trade_id");
        this.Property(t => t.trade_reference).HasColumnName("trade_reference");
        this.Property(t => t.last_updated).HasColumnName("last_updated");
        this.Property(t => t.client_application_code).HasColumnName("client_application_code");
        this.Property(t => t.trade_markup).HasColumnName("trade_markup");
    }
}

使用基本的POCO:

public partial class Trade
{
    public int trade_id { get; set; }
    public string trade_reference { get; set; }
    public System.DateTime last_updated { get; set; }
    public string client_application_code { get; set; }
    public string trade_markup { get; set; }
}

有没有办法指定何时使用[Queryable(PageSize = 1)]我希望从ORDER BY子句中排除xml列?我希望在映射中的某个地方做这个,但我无法弄清楚如何。

1 个答案:

答案 0 :(得分:2)

很棒的问题。

让我解释一下:当您添加PageResult或使用$ skip或$ top时,Web API会自动为您添加默认排序,以便结果稳定。您可以关闭默认排序,如下所示:

[Queryable(PageSize = 1, EnsureStableOrdering=false)]

如果您的数据库尚未订购结果,您可能仍希望为IQueryable添加某种排序。