Как этот Linq2Sql может создать перечисление в предложении select? - PullRequest
1 голос
/ 15 декабря 2008

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

Ответы [ 2 ]

3 голосов
/ 15 декабря 2008

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

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

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

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

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

0 голосов
/ 15 декабря 2008

Может быть, вы могли бы попробовать что-то подобное в ваших моделях. Декларация достижения:

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
...