0

序列在 System.Web.Http.OData.Builder.ODataConventionModelBuilder.RemoveBaseTypeProperties(EntityTypeConfiguration derivedEntity, EntityTypeConfiguration baseEntity) 在 System.Web.Http 的 System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) 包含多个元素.OData.Builder.ODataConventionModelBuilder.DiscoverInheritanceRelationships()...

这是我的绑定代码:

var modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<PeopleDto>("People");

这是我的控制器代码:

[Queryable]
public IEnumerable<PeopleDto> Get(
        [FromUri] Credentials credentials, 
        ODataQueryOptions<PeopleDto> options, 
        int departmentId,
        DetailLevel detail = DetailLevel.Low)
{
    var count = _repository.Filter(x => x.DepartmentId == departmentId && x.Active);
    options.ApplyTo(count);
    int total = count.Count();

    switch (detail)
    {
        case DetailLevel.Low:
            return new Paginable<PeopleDto>(GetMyPeopleLo(departmentId, options), total);
        // [...]
    }
}

Paginable<T>实现IEnumerable<T>。并且GetMyPeopleLo()(不是真实姓名)方法将选项应用于附加查询。(我不再需要额外的查询,因为我已经移动了分页代码的位置,但我还没有重构那部分)。

这是 oData 的预发布版本存在问题的情况之一吗?

更新:如果我注释出该Queryable属性,它似乎有效,但是在将选项应用于count查询时,我将无法实际应用在QueryString中指定的任何过滤器。

4

2 回答 2

3

有几件事在这里跳出来:

  • 您不应该使用 [Queryable] 和 ODataQueryOptions。它们用于做同样的事情。在这种情况下,ODataQueryOptions 似乎更合适,因此您应该删除 [Queryable]。
  • 您没有使用查询结果。而不是这个

    var count = _repository.Filter(x => x.DepartmentId == departmentId && x.Active);
    options.ApplyTo(count);
    int total = count.Count();
    

    你应该这样写:

    var count = _repository.Filter(x => x.DepartmentId == departmentId && x.Active);
    var queryResults = options.ApplyTo(count) as IQueryable<PeopleDto>;
    int total = queryResults.Count();
    

    这样,您的总数将考虑 OData 查询选项。

  • 考虑使用PageResult<T>而不是 Paginable,因为 OData 格式化程序将进行计数并将其正确插入 OData 提要。

于 2013-02-07T14:54:01.100 回答
3

我在以下两种情况下看到了这个错误。

  1. 影子实体成员 - 派生自影子实体而不是覆盖实体的类中的成员(请参阅差异讨论)。切换到覆盖解决了这里的问题。请注意,我可以通过在 Visual Studio 生成的警告中进行搜索来找到这些。
  2. BitmapImage类型的实体 Partial 类中的属性 - 将属性的类型更改为BitmapSource(BitmapImage 的直接继承父级)是此处的修复。
于 2015-01-20T12:19:41.793 回答