【问题标题】:OData "Sequence contains more than one element" errorOData“序列包含多个元素”错误
【发布时间】:2015-01-21 05:52:45
【问题描述】:

序列包含多个元素 在 System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 源)在 System.Web.Http.OData.Builder.ODataConventionModelBuilder.RemoveBaseTypeProperties(EntityTypeConfiguration 派生实体,EntityTypeConfiguration baseEntity) 在 System.Web.Http.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&lt;T&gt; 实现IEnumerable&lt;T&gt;GetMyPeopleLo()(不是真实姓名)方法将选项应用于附加查询。 (我不再需要额外的查询,因为我已经移动了分页代码的位置,但我还没有重构那部分)。

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

update:如果我评论 Queryable属性,它似乎有效,但是当我在Querystring中指定的任何过滤器实际上都应用于 count query @ query @ querystring中。 .

【问题讨论】:

  • 这听起来像是与您的 DTO 相关的问题。
  • @SLaks DTO 是一个非常苗条的类,其成员都是简单的类型、整数、布尔值和字符串。
  • If I comment out the Queryable attribute, it seems to work, but any filter that I specify in the querystring is not actually applied when options are applied to the count query.

标签: asp.net-web-api odata


【解决方案1】:

这里有几件事:

  • 您不应该使用 [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&lt;T&gt; 而不是 Paginable,因为 OData 格式化程序会进行计数并将其正确插入到 OData 提要中。

【讨论】:

  • 在我的版本中它仍然是ODataResult&lt;T&gt;。我有一个关于格式化下一页结果的 URI 的问题。有这方面的文档吗?
  • 很高兴它解决了:) 你的问题是什么?请记住,下一页链接是可选的。目前还没有关于这方面的官方文档,因为我们还没有发布 OData 支持。
【解决方案2】:

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

  1. 阴影实体成员 - 派生自阴影而不是覆盖的实体的类中的成员(参见 discussion of the difference)。切换到覆盖解决了这里的问题。请注意,我可以通过在 Visual Studio 生成的警告中进行搜索来找到这些。
  2. BitmapImage 类型的实体 Partial 类中的属性 - 将属性类型更改为 BitmapSource(BitmapImage 的直接继承父级)是此处的修复方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-21
    • 2014-09-18
    • 1970-01-01
    • 2015-01-21
    • 2014-03-09
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多