1

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

4

2 回答 2

3

您实际上可以在 LINQ-to-SQL 中直接使用枚举(但不能在实体框架中使用);只需将属性的类型(在 dbml/designer 中)更改为完全限定的枚举类型,它就会为您进行强制转换。当然,您可能希望将其命名为 AchievementType - 这假设是直接(转换)翻译。

如果这不适合您的方案,您可能必须将其选择为整数,然后在 LINQ-to-Objects 中进行最终转换(通过 AsEnumerable())。您也可以尝试直接转换(假设这已经足够)而不是您的通用扩展方法:

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

并不是说如果Models.Achievement在 dbml 中定义了类型,则不能以这种方式创建它 - 您必须简单地选择它。但是,如果这不是 db-model 的一部分,那就没问题了。是在 LINQ-to-SQL 中将字符串映射到枚举的相关示例。

如果这些都不适合,另一种方法是将枚举属性声明为部分类中的 shim。我在这里举了一个例子(对于 EF,但它的工作原理相同),但请注意,如果你这样做,你不能在Where子句等中使用 enum 属性,因为它没有映射到模型中。

于 2008-12-15T13:18:42.713 回答
0

也许你可以在你的 Models.Achievement 声明中尝试这样的事情:

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
于 2008-12-15T13:21:38.260 回答