这个 Linq2Sql 如何在 select 子句中创建枚举?
-
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 中使用枚举(但不能在实体框架中使用);只需将属性的类型(在 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;
}
}
不隶属于 StackOverflow