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

.net 这个Linq2Sql如何在select子句中创建枚举?,.net,linq-to-sql,enums,enumeration,.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 extens

我得到了以下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
            };
}

嗯。有没有一种方法可以让结果int转换成我的自定义枚举?

你可以直接在LINQ to SQL中使用枚举(但不是实体框架);只需将属性的类型(在dbml/designer中)更改为完全限定的枚举类型,它就会为您执行强制转换。当然,您可能想将其称为AchievementType——这是一种直接(强制)翻译

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

select new {..., AchievementType = (AchievementType) foo.Bar, ...}
并不是说,如果在dbml中定义了
Models.acquisition
类型,就不能以这种方式创建它-只需简单地选择它。但如果这不是db模型的一部分,那也没关系这是一个在LINQ到SQL中将字符串映射到枚举的相关示例


如果两者都不适合,另一种方法是将enum属性声明为分部类中的垫片。我给出了一个例子(对于EF,但其工作原理相同),但请注意,如果这样做,则不能在
Where
子句等中使用enum属性,因为它未映射到模型中。

也许您可以在模型中尝试类似的操作。成就声明:

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
AchieventType AchieventType{
得到
{
返回此.AchievementTypeId.ToEnum();
}
设置
{
this.AchievementTypeId=(int)值;
}
}

Wow-太棒了!我删除了AchievementType L2S类,并将AchievementType字段重命名为AchivementType。然后将属性类型设置为my FQDN enum struct。MS测试->工作!令人惊叹的!它不仅可以工作,而且我的设计器更干净,现在删除了查找类!太棒了!
  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }