0

我需要使用显式接口作为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的成员。

4

1 回答 1

1

问题是重复的Pointer属性名称。在 MongoDB 中,对象必须具有唯一的属性名。

解决方法只需使用两个具有不同名称的单独属性,将显式接口转发给它们,然后在查询中使用新属性。

public class Offer : OfferBase, IPointerTo<ServiceCategory>, IPointerTo<Company> 
{ 
  public string ServiceCategoryPointer { get; set; } 
  public string CompanyPointer { get; set; }

  string IPointerTo<ServiceCategory>.Pointer 
  { 
    get => ServiceCategoryPointer; 
    set => ServiceCategoryPointer = value;
  } 
  string IPointerTo<Company>.Pointer
   { 
    get => CompanyPointer; 
    set => CompanyPointer = value;
  } 
}
于 2019-08-07T21:48:04.037 回答