LINQ Group по разным выходам - PullRequest
0 голосов
/ 04 февраля 2019

Мне трудно сгруппировать dbset (EntityFramework) по двум полям и отправить этот вывод в строго типизированное представление.

Когда я использую анонимный тип для составного ключа, я получаю правильный вывод.Список, содержащий один элемент, и этот элемент, в свою очередь, содержит два или более элементов группировки.

Теперь, если вместо этого я использую класс, я получу список из двух элементов, и в свою очередь каждый элемент имеет один элемент группировки.

var output = context.Transfers.GroupBy(t=> new { t.TNumber, t.Type}).ToList();

var output2 = context.Transfers.AsEnumerable()
                     .GroupBy(t => new OTSpecs(t.TNumber, t.Type)).ToList();

OTSpecs - это простой класс с этими открытыми полями и конструктором параметров.

Мне нужно добавить AsEnumerable(), в противном случае я получу System.NotSupportedException Только конструкторы и инициализаторы без параметровподдерживаются в LINQ to Entities

Также потому, что мне нужно определить модель в представлении следующим образом

@model IEnumerable<IGrouping<OTSpecs, Transfer>>

, если, конечно, нет возможности заменить OTSpec в этой строке анонимным типом,Но я не знаю, как.

Мой вопрос: почему эти строки кода выдают другой результат?Можно ли определить модель в представлении, заменяющем спецификации OTS для анонимного типа?

1 Ответ

0 голосов
/ 04 февраля 2019

Анонимные типы реализуют сравнение на равенство, которое сравнивает все их свойства .Поэтому, когда вы используете анонимный тип в качестве ключа, linq может идентифицировать, что два ключевых объекта одинаковы и должны быть сгруппированы вместе.

Ваш пользовательский объект, я подозреваю, не реализует этот материал, поэтому для негоиспользуется только общее сравнение объектов, которое сравнивает ссылки.Два ключевых объекта имеют разностные ссылки, то есть разные группы.

Чтобы исправить это, вам может понадобиться передать равенство равенств или реализовать Equals в своем классе OTSpecs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...