Хобрук: Ваш путь к мастерству в программировании

Как этот Linq2Sql может создать перечисление в предложении select?

У меня есть следующий запрос linq2sql, и я устанавливаю результат в POCO. Одно из моих свойств POCO - это перечисление.

public IQueryable<Models.Achievement> GetAchievements()
{
    return from a in _sqlDatabase.Achievements
        select new Models.Achievement
            {
                // Note: ToEnum is an extension method that converts an int -> the enum.
                AchievementType = a.AchievementTypeId.ToEnum<Models.AchievementType>(),
                DateTimeCreated = a.DateTimeCreated,
                UserId = a.UserId
            };
}

Когда я запускаю запрос, я получаю следующую ошибку.

System.NotSupportedException: Method 'Models.AchievementType 
    ToEnum[AchievementType](int)' has no supported translation to SQL.

Хм. Есть ли способ, которым я могу быть достаточно хитрым, чтобы преобразовать результат int в мое настраиваемое перечисление?


Ответы:


1

Фактически вы можете использовать перечисления непосредственно в LINQ-to-SQL (но не в Entity Framework); просто измените тип свойства (в dbml / designer) на полностью определенный тип перечисления, и он выполнит приведение за вас. Конечно, вы можете назвать его AchievementType - и это предполагает прямой (литой) перевод.

Если это не соответствует вашему сценарию, вам, вероятно, придется выбрать его как целое число, а затем выполнить окончательное приведение в LINQ-to-Objects (через AsEnumerable ()). Вы также можете попробовать прямое приведение (при условии, что этого достаточно) вместо вашего универсального метода расширения:

select new {..., AchievementType = (AchievementType) foo.Bar, ...}

Не то чтобы, если тип Models.Achievement определен в dbml, вы не можете создать его таким образом - вам нужно просто выбрать его. Но если это не часть db-модели, тогда все в порядке. Здесь связанный пример сопоставления строк с перечислениями в LINQ -to-SQL.

Если ни один из этих вариантов не подходит, другой подход - объявить свойство enum как прокладку в частичном классе. Я привел пример этого здесь (для EF, но он работает так же), но обратите внимание, что если вы сделаете это, вы не сможете использовать свойство enum в предложениях Where и т. д., поскольку оно не отображается в модели.

15.12.2008
  • Вау, невероятно! Я удалил свой класс AchievementType L2S и переименовал поле AchievementTypeId в AchivementType. Затем установите тип свойства в мою структуру перечисления FQDN. MS тестировал - ›работал! классно! Это не только работает, но и мой дизайнер стал чище: теперь классы поиска удалены! awesomesauce! 16.12.2008

  • 2

    Может быть, вы могли бы попробовать что-то подобное в своем объявлении Models.Achievement:

      AchievementType achievementType{
        get
          {
             return this.AchievementTypeId.ToEnum<Models.AchievementType>();
          }
          set
          {
            this.AchievementTypeId = (int)value;
          }
        }
    
    15.12.2008
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..