2013-04-02 55 views
2

我試圖通過使用OData和ASP.NET Web API的實體框架從SQL Server中檢索行。當其中一列是xml類型時遇到問題。如果我回到下面的控制器使用[可查詢]整套沒有問題:使用Queryable(PageSize = 1)屬性無法檢索xml列

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

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

但是當我使用[可查詢(每頁= 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子句引起第e錯誤。如果我刪除'[Extent1]。[trade_markup] ASC',並運行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; } 
} 

是否有使用時指定的方式[可查詢(每頁= 1)]我想要的xml列被排除在ORDER BY子句之外?我希望在測繪的某個地方做到這一點,但我無法弄清楚。

回答

2

偉大的問題。

讓我解釋一下:當您添加一個PageResult或使用$ skip或$ top時,Web API會自動爲您添加默認排序,以便結果穩定。你可以關閉默認的排序是這樣的:

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

您可能仍然想添加某種訂貨到您的IQueryable如果結果不是已經被你的數據庫下令。

+0

感謝Youssef的快速反應。這解決了我的問題。按照預期,我現在正在獲得第一筆交易,並鏈接到下一筆交易。不幸的是,我沒有足夠的聲望來讚揚它。 – liamfinnie

+0

不用擔心。很高興它成功了:) –