Ошибка OData «Последовательность содержит более одного элемента»

Последовательность содержит более одного элемента   в System.Linq.Enumerable.SingleOrDefault [TSource] (источник IEnumerable`1) в   System.Web.Http.OData.Builder.ODataConventionModelBuilder.RemoveBaseTypeProperties (EntityTypeConfiguration receivedEntity, EntityTypeConfiguration baseEntity)     в System.Web.Http.OData.Builder.ODataConventionModelBuilder.DiscoverInheritanceRelationships() ...

Вот мой код привязки:

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

Вот мой код контроллера:

[Queryable]
public IEnumerable Get(
        [FromUri] Credentials credentials, 
        ODataQueryOptions 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(GetMyPeopleLo(departmentId, options), total);
       //[...]
    }
}

Paginable implements IEnumerable. And the GetMyPeopleLo() (not the real name) method applies the options to the additional queries. (I don't need additional queries anymore, because I have moved the location of the pagination code, but I just haven't refactored that part yet).

Является ли это одним из тех случаев, когда есть проблема с предварительной версией oData?

Update: 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.

0
nl ja de
@SLaks DTO - очень тонкий класс, членами которого являются простые типы, ints, bools и строки.
добавлено автор devlord, источник
Если я комментирую атрибут Queryable , он работает, но любой фильтр, который я указываю в querystring, фактически не применяется, когда параметры применяются к запросу count .
добавлено автор devlord, источник
Это звучит как проблема, связанная с вашим DTO.
добавлено автор SLaks, источник

3 ответы

Здесь выпрыгивают пара вещей:

  • You shouldn't be using [Queryable] and ODataQueryOptions. They're used for doing the same thing. In this case, ODataQueryOptions seems more appropriate so you should just remove [Queryable].
  • You're not using the results of your query. Instead of this

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

    You should be writing this:

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

    That way your total will take into account the OData query options.

  • Consider using PageResult instead of Paginable since the OData formatters will take the count and insert it correctly into the OData feed.

2
добавлено
Duh! Спасибо @Youssef!
добавлено автор devlord, источник
Чувак, он работает! Я назначаю Юссефа для MVP!
добавлено автор devlord, источник
В моей версии это еще ODataResult . У меня возник вопрос о форматировании URI для результата следующей страницы. Есть ли для этого документация?
добавлено автор devlord, источник
Рад, что это сработало:) В чем ваш вопрос? Имейте в виду, что ссылка следующей страницы необязательна. Официальной документации по этому поводу пока нет, потому что пока мы еще не выпустили поддержку OData.
добавлено автор Youssef Moussaoui, источник

Я получил эту ошибку, потому что я вызывал .Single() результат с несколькими элементами.

Описание метода в подсказке говорит:

Возвращает единственный элемент последовательности и выдает исключение, если   в последовательности нет ровно одного элемента.

(Если вы пытаетесь найти первый из нескольких элементов, вызов .First() вместо .Single() может быть тем, что вы ищете.)

1
добавлено
Я не думаю, что это причина ошибки OP (или моей). Это специально вписывается в написанный Microsoft код.
добавлено автор Josh Mouch, источник

Я видел эту ошибку в следующих двух сценариях.

  1. Shadowed Entity Members - члены в классах, которые производятся от объектов, которые теневые, а не переопределяют (см. это обсуждение разницы ). Перестановка для переопределения разрешила проблему здесь. Обратите внимание, что я смог найти их, выполнив поиск в предупреждениях, созданных Visual Studio.
  2. Свойство в объекте Частичный класс типа BitmapImage - Изменение типа свойства на BitmapSource (родитель прямого наследования BitmapImage) был исправлен здесь.
1
добавлено
p1 помог мне. Спасибо!
добавлено автор Zar Shardan, источник
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)