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

StackOverflow https://stackoverflow.com/questions/368323

Вопрос

у меня есть следующий запрос 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 в мое собственное перечисление?

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top