2017-05-23 2 views
0

IEnumerableNewUnitPhaseStatusと返す方法は列挙型ですか?SQLクエリーから列挙するintをキャストするC#エンティティフレームワーク

SQLでは、値 "NewUnitPhaseStatus"はintとして格納されます。クエリを返すだけで、値を抽出しようとすると、DBcontextが破棄されたというメッセージが表示されます。しかし、クエリの結果をリストに変換しようとすると、intはNewUnitPhaseStatus(enum型)に型変換できないというメッセージが表示されます。

public IEnumerable<UnitPhaseLog> GetAllForUnitPhase(long unitPhaseId) 
{ 
    using (var db = new DbContext(_connStringKey)) 
    { 
     var querys = from s in db.UnitPhaseLogs 
         where s.UnitPhaseId == unitPhaseId 
         select s; 

      return querys; 
    } 
} 

1がenumに各行を変換するために、foreach文を使用している場合のvarクエリが列挙型に等しいNewUnitPhaseStatusでクラスUnitPhaseLogであるため、彼らはエラーが発生します。

エラーメッセージ:

1は、リストに結果を変換しようとした場合。

'UnitPhaseLog'の 'NewUnitPhaseStatus'プロパティを 'System.Int64'値に設定できませんでした。このプロパティーを 'Core.UnitPhaseStatus'タイプの非ヌル値に設定する必要があります。

1だけでクエリを返すようにしようとすると自分自身を結果:

DbContextが配置されているため、操作を完了することができません。

コード:

public enum UnitPhaseStatus 
{ 
    [Display(Name = "No Status")] 
    NoStatus, 
    [Display(Name = "Not Ready")] 
    NotReady, 
    [Display(Name = "Materials Needed")] 
    MaterialsNeeded, 
    [Display(Name = "Ready For Work")] 
    ReadyForWork, 
    [Display(Name = "Work In Progress")] 
    WorkInProgress, 
    [Display(Name = "Ready")] 
    ReadyForQc, 
    [Display(Name = "Approved")] 
    Approved, 
    [Display(Name = "Rejected")] 
    Rejected, 
} 
+1

あなたはこの行について話していますか? 'UnitPhaseStatus UnitPhaseStatus = query.NewUnitPhaseStatus;' – DigiFriend

+0

したがって、SQLでは値はintとして格納されます。私はクラスの列挙型としてそれを返そうとしていますUnitPhaseStatus – Ophiucus

+1

UnitPhaseStatusを定義したコードを表示してください。 enum値はSQL定義と一致する必要があります。 – Bestter

答えて

2

あなたは列挙型にデータベースからの戻り値をキャストする必要があります。

unit.NewUnitPhaseStatus = (UnitPhaseStatus)UnitPhaseStatus; 

余分なローカル変数を調べなくても、これを直接実行することもできます。だから、

、代わりに:

あなたが使用することができます
UnitPhaseStatus UnitPhaseStatus = query.NewUnitPhaseStatus; 
unit.NewUnitPhaseStatus = UnitPhaseStatus; 

unit.NewUnitPhaseStatus = (UnitPhaseStatus)query.NewUnitPhaseStatus; 
+0

varクエリは型がNewUnitPhaseStatusであるため、foreach文でコードが壊れます – Ophiucus

+2

私はあなたに従うとは思わない。 OK。どのタイプが 'UnitPhaseLog.NewUnitPhaseStatus'ですか? 'query.NewUnitPhaseStatus'はどんな型ですか(名前ではなく型)?タイプは一致する必要があります。彼らがしなければ、あなたはキャストする必要があります。 – DigiFriend

1

これは、Entity Frameworkのを使用していると仮定しているので、あなたは無視して自由に感じるそうしていない場合。

Intを列挙型に、または列挙型をIntにキャストするのではなく、エンティティを変更してその列を列挙型に直接バインドし、フレームワークが変換を行うようにする方がよいでしょう。

+0

しかし、どのように結果をクエリしますか? – Ophiucus

+0

変換エラーが発生した場合は、結果をリストとして取得できるはずです。 –

1

そのforeachループを台無しにあなたのための必要はありません - あなたのquerysは右のタイプで、すでにあるので、それはnullない場合は、ちょうどそれを返します。

public IEnumerable<UnitPhaseLog> GetAllForUnitPhase(long unitPhaseId) 
{ 
    using (var db = new DbContext(_connStringKey)) 
    { 
     var querys = from s in db.UnitPhaseLogs where s.UnitPhaseId == unitPhaseId select s; 

     List<UnitPhaseLog> UnitPhaseLogList = new List<UnitPhaseLog>(); 
     if (null == querys) return UnitPhaseLogList; 

     return querys; 
    } 
} 
+0

'UnitPhaseLog'の 'NewUnitPhaseStatus'プロパティを 'System.Int64'値に設定できませんでした。このプロパティーを 'Core.UnitPhaseStatus'タイプの非ヌル値に設定する必要があります。 – Ophiucus

+1

これは、あなたの 'UnitPhaseLog.NewUnitPhaseStatus'が本当に' Core.UnitPhaseStatus'であるべきときに 'long'であることを示唆しています。これは恐らくすべての問題が発生している場所です。 – DigiFriend

+0

これはUnitPhaseStatusです。私は、IEnumerableをデータを取得する前にリストに入れないと、データが破棄されたと言いました。 – Ophiucus

関連する問題