我有属性_report_type的文档,它应该包含字符串“FTE”或“CAB”。 在遗留文档中,它可以为null或根本不存在(未定义),它们应该是“ContractorWorkReport”。
我的映射:
public class Order : Document, IBaseEntity<string>
{
[JsonProperty(Order = 70, PropertyName = "orderData")]
public OrderData Data { get; set; }
}
public class OrderData
{
[JsonProperty(Order = 60, PropertyName = "_order_type")]
public OrderType? OrderType { get; set; }
}
[JsonConverter(typeof(StringEnumConverter))]
public enum OrderType
{
[EnumMember(Value = "TFE")]
ContractorWorkReport,
[EnumMember(Value = "CAB")]
BudgetElectricMeter
}
我的查询基于:
var query = _client.CreateDocumentQuery<T>($"/dbs/{_databaseId}/colls/{CollectionId}");
if (filter.OrderType.Value == OrderType.ContractorWorkReport)
query = query.Where(o => o.Data.OrderType == null || !o.Data.OrderType.HasValue || o.Data.OrderType == filter.OrderType);
else
query = query.Where(o => o.Data.OrderType == filter.OrderType);
由于o.Data.OrderType == null,此查询崩溃,错误消息为: 无法将类型为“Microsoft.Azure.Documents.Sql.SqlNullLiteral”的对象强制转换为“Microsoft.Azure.Documents.Sql.SqlNumberLiteral”。'
如何解决这个问题?现在,我这样做,但它很脏......
if (filter.OrderType.Value == OrderType.ContractorWorkReport)
query = query.Where(o => o.Data.OrderType != OrderType.BudgetElectricMeter);
else
query = query.Where(o => o.Data.OrderType == filter.OrderType);
谢谢!
答案 0 :(得分:1)
首先,我建议你将它用于CreateDocumentQuery中的第一个参数:UriFactory.CreateDocumentCollectionUri(databaseId, collectionId)
要回答您的问题,您要将int与null进行比较。作为枚举的o.Data.OrderType
解析为int。您可能希望将其与默认枚举值0
进行比较,或查询o.Data.OrderType
根本不是关键字的文档