我有以下 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 中使用枚举(但不能在实体框架中使用);只需将属性的类型(在 dbml/designer 中)更改为完全限定的枚举类型,它就会为您进行转换。当然,您可能想将其称为 AchievementType - 这假设是直接(演员)翻译。

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

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

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

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

其他提示

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

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top