我需要使用显式接口作为FilterDefinition来构造查询,但它会引发异常说:
System.InvalidOperationException
Message={document}.Pointer is not supported.
Source=MongoDB.Driver
我已经用普通的接口实现尝试了这个,它按预期工作。但是我需要显式实现一个接口,因为我有 2 个具有相同属性名称的接口,如下面的代码所示:
public class Offer : OfferBase, IPointerTo<ServiceCategory>,
IPointerTo<Company>
{
[BsonElement("_p_ServiceCategoryObj")]
[JsonProperty("serviceCategoryObj")]
string IPointerTo<ServiceCategory>.Pointer { get; set; }
[BsonElement("_p_companyObj")]
[JsonProperty("companyObj")]
string IPointerTo<Company>.Pointer { get; set; }
}
因此,我创建了一个将在Find中使用的FilterDefinition。正如我之前提到的,如果它不是一个实现,这很好。例如:如果只使用其中一个通常实现而另一个显式使用,它将在查询正常的时起作用。但是具有上述代码约束并像这样创建过滤器:explicit interface
FilterDefinition<Offer> innnerFilter = MongoQueryBuilder.AddFilter<Offer>
(offer =>string.IsNullOrEmpty((offer as
IPointerTo<ServiceCategory>).Pointer));
因此,当使用该过滤器执行 Find 时,会引发上述异常。
注意: MongoQueryBuilder.AddFilter 只是我为使其更容易而做的一个包装器,但这不是问题,因为所有其他查询都可以使用它正常工作。
我希望在仅正常实现一个接口并使用该接口成员查询时得到结果,但在我当前的情况下,我需要同时实现它们,因此必须显式实现它们。
我可能没有正确地做某事或按我应该的方式使用它,但我还没有找到任何解决方案。
编辑:(感谢@Lakerfield 的回答)
当我要求报价时,我无法找到指针,而作为指针,它无法公开找到它。所以,我能够像这样解决它:explicit interface
public class Offer : OfferBase, IPointerTo<ServiceCategory>, IPointerTo<Company>
{
[BsonIgnoreIfNull]
[BsonIgnoreIfDefault]
[BsonElement("_p_ServiceCategoryObj")]
[JsonProperty("serviceCategoryObj")]
public string ServiceCategoryPointer
{
get => (this as IPointerTo<ServiceCategory>).Pointer;
set => (this as IPointerTo<ServiceCategory>).Pointer = value;
}
[BsonIgnore]
string IPointerTo<ServiceCategory>.Pointer { get; set; }
[BsonIgnoreIfNull]
[BsonIgnoreIfDefault]
[BsonElement("_p_companyObj")]
[JsonProperty("companyObj")]
public string CompanyPointer
{
get => (this as IPointerTo<Company>).Pointer;
set => (this as IPointerTo<Company>).Pointer = value;
}
[BsonIgnore]
string IPointerTo<Company>.Pointer { get; set; }
然后像这样进行查询:(现在我使用Linq而不是FilterDefinition但这与此解决方案无关)
private static Expression<Func<Offer, bool>> InnerQueryServiceCategory(string serviceCategoryId)
{
return offer => (offer.IsDeleted == false || !offer.IsDeleted.HasValue) && offer.ServiceCategoryPointer == PointedCollections.ServiceCategoryCollection.GetDescription() + serviceCategoryId;
}
offer.ServiceCategoryPointer是公开可用的,它是Offer的成员。