我正在尝试使用带有 ASP.NET Web API 的 OData 通过实体框架从 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.
这是因为Entity Framework已经生成的sql(通过profiler查看)是:
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 子句中会导致错误。如果我删除 '[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; }
}
有没有办法在使用 [Queryable(PageSize = 1)] 时指定我希望将 xml 列从 ORDER BY 子句中排除?我希望在映射的某个地方做到这一点,但我不知道如何做。