2011-01-17 3 views
0

SQL 2008データベースには、User、CutomerUser、SalesUserという3つのテーブルがあります。それらは異なるタイプのユーザーを表します。私の概念モデルでは、これらはCustomerUserとSalesUserエンティティがUserから継承されるようにモデル化されています。データベースレベルでは、CustomerUserとSalesUserは、Userに外部キーを同時に送信するプライマリキーを持っています。したがって、関係は0から1まで1である。クエリ内の継承されたエンティティオブジェクトの特定のサブタイプで証明条件をフィルタリングするにはどうすればよいですか?

CustomerUserテーブルにはCustomerNumberカラムがあり、SalesUserテーブルにはRepresentativeCodeカラムがあります。選択基準に基づいて、Users、CustomerUsersまたはSalesUsersがそこにあるものを返すクエリを記述したいと思います。 CustomerUsersもSalesUsersもないユーザーが存在することに注意してください。

タイプを問わず、指定された文字列と等しいログインを持つすべてのユーザーが返信しないようにします。さらに、CustomerUserが指定された文字列と等しい顧客番号を持っている場合、それを返したいと思います。同様に、指定された文字列に等しいコードを持つSalesUsersを返したいと思います。

私は次のクエリを記述します。クエリのコンパイル

var users = from u in Context.Users 
where (((u is CustomerUser) && ((CustomerUser)u).CustomerNumber.Equals(criteria)) 
|| ((u is SalesUser) && ((SalesUser)u).RepresentativeCode.Equals(criteria))) 
|| u.Login.Equals(criteria) 
select u; 

が、クエリが実行されますと、ランタイムでは、次の例外がスローされます「タイプをキャストする

」できませんMyDb.Models LINQ to Entitiesは、Entity Data Modelプリミティブ型のキャストのみサポートしています。 "

どのようにしてクエリを作成すれば動作するのですか?

注:ToList()を実行してからソリューションの種類をキャストすると、私はここではうまくいかないので、パイプラインのクエリに並べ替え/ページングを適用します。

答えて

1

キャストasを使用する必要があります。 L2Eがヌルを合併するという事実を利用することもできます。

var users = from u in Context.Users 
      let customerNumber = (u as CustomerUser).CustomerNumber 
      let representativeCode = (u as SalesUser).RepresentativeCode 
      where customerNumber.Equals(criteria) 
        || representativeCode.Equals(criteria) 
        || u.Login.Equals(criteria) 
      select u; 
+0

ありがとうございました。 –

関連する問題