2011-12-17 10 views
2

私はEntity Framework 4モデルを持っています。そのモデル、サブスクライバおよびバージョンで2つのテーブルがあります:私はEntity Framework 4を使用する必要があるクエリを生成する方法を知らない

CREATE TABLE tracking."Subscribers" 
(
    "SubscriberId"  UUID    NOT NULL, 
    "RemoteAddress"  VARCHAR(80)  NOT NULL, 
    "Priority"   INTEGER   NOT NULL DEFAULT 100, 
    "DataTypeId"   INTEGER   NOT NULL REFERENCES tracking."DataTypes" ("DataTypeId"), 
    "Condition"   VARCHAR(8000), 
    "Version"   BIGINT    NOT NULL DEFAULT 0, 
    "LastConnected"  TIMESTAMPTZ  NOT NULL, 
    CONSTRAINT "Subscribers_pkey" PRIMARY KEY ("SubscriberId", "DataTypeId") 
); 


CREATE TABLE tracking."Versions" 
(
    "ObjectId"   UUID    NOT NULL, 
    "Source"    UUID     NULL, 
    "From"    BIGINT    NOT NULL, 
    "To"     BIGINT     NULL, 
    "DataTypeId"   INTEGER   NOT NULL REFERENCES tracking."DataTypes" ("DataTypeId"), 
    CONSTRAINT "Versions_pkey" PRIMARY KEY ("ObjectId", "DataTypeId") 
); 

はい、そこに第三の表は、あるデータ型が、それは、ルックアップテーブル&が重要ではないのです。

また、VersionsテーブルのFrom & Toカラムに格納されている値がバージョン番号を表していることが必要です。 To列がNULLでない場合、ObjectIdによって表される特定の項目がデータベースから削除されたことを意味します。

私のC#コードでは、クエリを作成する必要があります。データタイプID &バージョン番号の各組み合わせに対して1つのエントリを含むディクショナリがあります。 ORではなく一連のテストを構築する必要があります。

通常、たDbCommandで使用するための文字列としての条件を構築するために、私はこのようなコードを使用したい:

bool isFirst = true; 
string query = "..."; 

foreach (KeyValuePair<int, long> version in versionsLastSent) { 
    if (! isFirst) { 
     query += " OR "; 
    } 

    query += "...."; 
    isFirst = false; 
} 

をしかし、私はそれを取得する方法を知っているか、またはクエリに使用しないでくださいエンティティフレームワーク。私は私のクエリはジェネリックのIQueryableオブジェクトになることを知っていると私は

query = query.Where(a => ...); 

を使用して、それに条件を追加することをしかし、これらは通常、ANDで分離されています。 ORが必要です。

どうすればよいですか?

トニー

編集:

SELECT * を加入者を登録しよう バージョンから:

は、私が行ったときに、クエリは次のようになりする必要があることを言及するのを忘れてしまいました。 。 。 WHERE <一部の条件> AND(VersionCondition1 OR VersionCondition2 OR ...)

答えて

2

あなたがUnionを使用して、まったく同じ結果を得ることができるので、最も簡単な方法は、ORせずに次のようになります。

IQueryable originalQuery = ...; 
IQueryable query = null; 

foreach (KeyValuePair<int, long> version in versionsLastSent) { 
    IQueryable queryPart = originalQuery.Where(...); 
    if (query == null) 
     query = queryPart; 
    else 
     query = query.Union(queryPart); 
} 
+0

これは有望に見えます!私はこれを打ち、動作するかどうかを見てみましょう。 –

+0

そのクエリです。元のクエリであると思われるforeachの最初の行を呼び出しました。どこですか? –

+0

@TonyVitabileはい、それをキャッチするために感謝します。私は私の答えを更新しました。 – hvd

0

PredicateBuilderをご覧ください。

http://www.albahari.com/nutshell/predicatebuilder.aspx

基本的には

var predicate = new PredicateBuilder.False<YourType>(); 

if(someCondition) 
{ 
    predicate = predicate.Or(x=>x == newCondition); 
} 

query = context.where(predicate); 

それはあなたが使用しているOR構築する場合には.FALSE()で開始することが重要です...(ラフ擬似コード)をこのような何かをしたいですあなたの質問。これは、あなたが上に構築することができるfalseへの基本評価を与えるでしょう。

関連する問題