1

次の linq2sql クエリがあり、結果を POCO に設定しています。私の POCO プロパティの 1 つは列挙型です。

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 で直接使用できます (ただし、Entity Framework では使用できません)。プロパティの型 (dbml/designer 内) を完全修飾列挙型に変更するだけで、キャストが実行されます。もちろん、これを AchievementType と呼びたいと思うかもしれません。これは、ストレート (キャスト) 変換を前提としています。

これがシナリオに合わない場合は、おそらく整数として選択し、LINQ-to-Objects で (AsEnumerable() を介して) 最終的なキャストを行う必要があります。一般的な拡張メソッドの代わりに、ストレート キャストを試すこともできます (これで十分であると仮定します)。

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

タイプが dbml で定義されている場合、Models.Achievementこの方法で作成することはできません。単純に選択する必要があります。しかし、これが db-model の一部でなければ問題ありません。これは、LINQ-to-SQL で文字列を列挙型にマッピングするための関連例です

これらのいずれにも当てはまらない場合、もう 1 つの方法は、enum プロパティを部分クラスの 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 に答える