Как этот Linq2Sql может создать перечисление в предложении выбора?
-
21-08-2019 - |
Вопрос
у меня есть следующий запрос 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;
}
}