这个Linq2Sql如何在select子句中创建一个枚举?

时间:2008-12-15 13:14:31

标签: .net linq-to-sql enums enumeration

我有以下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转换为我的自定义枚举?

2 个答案:

答案 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;
      }
    }