de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Mike
Mike
Вопрос

LINQ-to-entity generic == обходной путь

У меня есть следующий запрос LINQ-to-entities

IQueryable> GetFirstOperationsForEveryId
    (IQueryable> ItemHistory)
{
    var q = (from h in ItemHistory
             where h.OperationId ==
                (from h1 in ItemHistory
                 where h1.GenericId == h.GenericId
                 select h1.OperationId).Min()
             select h);
    return q;
}

ItemHistory is a generic query. It can be obtained in the following way

var history1 = MyEntitiySet1.Select(obj =>
    new History{ obj.OperationId, GenericId = obj.LongId });
var history2 = AnotherEntitiySet.Select(obj =>
    new History{ obj.OperationId, GenericId = obj.StringId });

In the end of all I want a generic query being able to work with any entity collection convertible to History.

Проблема заключается в том, что код не компилируется из-за сравнения GenericId во внутреннем запросе (Operator '==' не может применяться к операндам типов T и T.

Если я изменяю == на h1.GenericId.Equals (h.GenericId) , я получаю следующий NotSupportedException :

Невозможно ввести тип «System.Int64» для ввода «System.Object». LINQ to Entities поддерживает только листинг примитивных типов данных Entity Data Model.

Я попытался сделать группировку вместо подзапроса и присоединиться к результатам.

IQueryable> GetFirstOperationsForEveryId
    (IQueryable> ItemHistory)
{
    var grouped = (from h1 in ItemHistory
                   group h1 by h1.GenericId into tt
                   select new
                   {
                        GenericId = tt.Key,
                        OperationId = tt.Min(ttt => ttt.OperationId)
                   });

    var q = (from h in ItemHistory
             join g in grouped
                on new { h.OperationId, h.GenericId }
                equals new { g.OperationId, g.GenericId }
             select h);
    return q;
}

Он компилируется, потому что GenericId сравнивается с ключевым словом equals , и он работает, но запрос с реальными данными слишком медленный (он работает в течение 11 часов на выделенном сервере postgresql).

Существует возможность построить целое выражение для выражения external where. Но код будет слишком длинным и неясным.

Существуют ли какие-либо простые обходные пути для сравнения равенства с дженериками в LINQ-to-entity?

2 2011-10-27T13:44:55+00:00 4
 Mike
Mike
Редактировал вопрос 28-го октября 2011 в 6:41
Программирование
c#
entity-framework
linq-to-entities
entity-framework-4
MerickOWA
27-го октября 2011 в 3:12
2011-10-27T15:12:25+00:00
Дополнительно
Источник
Редактировать
#56789431

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

IQueryable> GetFirstOperationsForEveryId
    (IQueryable> ItemHistory)
{
  var q = from h in ItemHistory
          group h by h.GenericId into tt
          let first = (from t in tt
                        orderby t.GenericId
                        select t).FirstOrDefault()
          select first;

  return q;
}
1
0
Yorak Hunt
27-го октября 2011 в 1:47
2011-10-27T13:47:29+00:00
Дополнительно
Источник
Редактировать
#56789430
IQueryable> GetFirstOperationsForEveryId
(IQueryable> ItemHistory)
{
var grouped = (from h1 in ItemHistory
               group t by h1.GenericId into tt
               select new
               {
                    GenericId = tt.Key,
                    OperationId = tt.Min(ttt => ttt.OperationId)
               });

var q = (from h in ItemHistory
         join g in grouped
            on new { h.OperationId, h.GenericId }
            equals new { g.OperationId, g.GenericId }
         select h);
return q;
}
0
0
Wouter de Kort
28-го октября 2011 в 6:52
2011-10-28T06:52:47+00:00
Дополнительно
Источник
Редактировать
#56789432

Вы также можете установить общее ограничение на T для IItemHistory inteface, которое реализует свойство GenericId и OperationId.

0
0
Mike
28-го октября 2011 в 11:16
2011-10-28T11:16:04+00:00
Дополнительно
Источник
Редактировать
#56789433

Мой вопрос уже содержит решение. Второй метод с group + join работает хорошо, если таблица правильно проиндексирована . Для извлечения 370 тыс. Строк из таблицы базы данных требуется 3,28 секунды. На самом деле в не-generic варианте первый запрос медленнее на postgresql, чем второй. 26,68 секунды против 4,75.

0
0
Похожие сообщества 6
ExtremeCode чат
ExtremeCode чат
6 232 пользователей
Общение на темы YouTube канала и программирования. Вакансии не размещаем. Основной канал: @extremecode Курилка (флуд здесь): @extremecode_rest
Открыть telegram
Microsoft Stack Jobs
Microsoft Stack Jobs
2 458 пользователей
Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks
Открыть telegram
С#
С#
2 372 пользователей
Стараемся не флудить. Пишем по делу. Правила: https://t.me/professorweb/430450 Для флуда @svoboda_obsh
Открыть telegram
CODE BLOG / C#
CODE BLOG / C#
1 780 пользователей
Чат для .NET разработчиков и C# программистов. По всем вопросам: @shwanoff Youtube-канал: https://youtube.com/codeblog Основной канал: @codeblog Вконтакте: https://vk.com/codeblog Правила: https://t.me/codeblog_csharp/246972 Вакансии по тегу #work
Открыть telegram
var chat = new Chat();
var chat = new Chat();
1 255 пользователей
Обсуждение вопросов по .NET Правила чата – https://blog.devdigest.today/chat-rules Чат для флуда – https://t.me/+MXQZTV9pdq5hM2Ri
Открыть telegram
C#/.NET Для Новичков
C#/.NET Для Новичков
329 пользователей
Группа создана для тех, кто изучает язык программирования C#. Верховный главнокомандующий: @BlackDeveloper Оффтоп - разрешен в меру, реклама - бан.
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 4 дня назад
2
Hideo Nakagawa
Зарегистрирован 5 дней назад
3
Sergiy Tytarenko
Зарегистрирован 1 неделю назад
4
shoxrux azadov
Зарегистрирован 1 неделю назад
5
Koreets Koreytsev
Зарегистрирован 1 неделю назад
© de-vraag 2022
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией