2016-07-25 2 views
0

に列挙型を参照します。エニュメレーションはEDMXファイルで定義されています。は、どのように私は、次の(簡体字)エンティティSQLクエリを持つエンティティSQL

そのままですが、このクエリは機能しません.CustomerStatusがInt32と互換性がないという例外(その基になる型 int)の例外をスローします。しかし、列挙名の前にどのような名前空間を付けても、IN {}句のCustomerStatus値のリストを定義する方法が見つかりませんでした。例えば、

SELECT VALUE a 
FROM Customers AS a 
WHERE a.Status NOT IN { MyModelEntities.CustomerStatus.Reject, MyModelEntities.CustomerStatus.Accept } 

は、コンテナ内のMyModelEntities.CustomerStatus、またはそのようないくつかを見つけることができなかったと言って例外をスロー、動作しませんでした。

は最終的に私は、このような

SELECT VALUE a 
FROM Customers AS a 
WHERE CAST(a.Status AS System.Int32) NOT IN { 2, 3 } 

として、int型にStatusの鋳造に頼っが、私はもっとエレガントなソリューションを期待していました。

+0

クエリが送信される前に列挙型を(int)にキャストできませんか? –

+0

@DanielLorenzどういう意味ですか?あなたが最後のクエリで見ることができるように、結局それは私がしたことです。 –

+0

自分でSQLを構築しているのですか、またはDbSetを使用していますか?自分でSQLを構築する場合、データベースには列挙型の概念がないため、intを使用する必要があります。 EFはそれをintに変換します。 –

答えて

0

あなたはEntity SQLを直接作成しています。私は参照してください...手でEntity SQLを書くのではなく、DbSetを使用していない理由は何ですか?常に行うことができます

var statuses = new [] { Status.A, Status.B }; 
var query = context.SomeTable.Where(a => !statuses.Contains(a.Status)).ToList(); 
+0

なぜなら、クエリは実際には 'String.Format'で動的に生成され、エンティティから選択されたカラムを置き換え(実際のクエリは実際に' a'のナビゲーションプロパティを選択します)、 'WHERE'句を変更するからです。 –

+0

ええと、ここでは動的SQLの使用を保証するものはありません。 ctx.Customers.Where(a => statuses ..)を実行することはできません。(a => a.Value).ToList()を選択しますか? –

+0

実際のクエリはより複雑です。私は 'a.ValueA'または' a.ValueB'を選択することができ、ステータスリストに加えて、 'WHERE'節には追加の動的条件があります。 'String.Format(" Select VALUE a。{0} "を選択した場合、顧客は となります。CAST(a.Status AS System.Int32)では{{2、3}}であり、{1}はNULLではありません" 、selectedProperty、filterProperty) ' –

関連する問題