我有以下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.
HMM。有没有一种方法可以使结果int转换为我的自定义枚举?
答案 0 :(得分:3)
您实际上可以直接在LINQ-to-SQL(但不是实体框架)中使用枚举;只需将属性的类型(在dbml / designer中)更改为完全限定的枚举类型,它将为您执行转换。当然,您可能希望将其称为AchievementType - 这假设是直接(演员)翻译。
如果这不适合您的场景,您可能必须选择它作为整数,然后在LINQ-to-Objects中进行最终的转换(通过AsEnumerable())。您也可以尝试直接转换(假设这已足够)而不是您的通用扩展方法:
select new {..., AchievementType = (AchievementType) foo.Bar, ...}
如果在dbml中定义Models.Achievement
类型,则不能以这种方式创建它 - 您必须简单地选择它。但如果这不是db模型的一部分那么它就没问题了。 Here是在LINQ-to-SQL中将字符串映射到枚举的相关示例。
如果这些都不适合,另一种方法是将枚举属性声明为部分类中的垫片。我给出了这个here的示例(对于EF,但它的工作方式相同),但请注意,如果这样做,则不能在Where
子句等中使用枚举属性,因为它不是在模型中映射。
答案 1 :(得分:0)
也许你可以在你的Models.Achievement声明中尝试这样的事情:
AchievementType achievementType{
get
{
return this.AchievementTypeId.ToEnum<Models.AchievementType>();
}
set
{
this.AchievementTypeId = (int)value;
}
}