2011-12-17 51 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") 
); 

是的,有一個第三個表,數據類型,但它是一個查找表&並不重要。

此外,您需要知道存儲在版本表中的列中的值代表版本號。如果To列不爲空,則表示由ObjectId表示的特定項目已從數據庫中刪除。

在我的C#代碼中,我需要構建一個查詢。有一個字典,其中包含每個數據類型ID &版本號的組合的一個條目。我需要建立一系列由ORs而不是ANDs進行測試的測試。

通常情況下,建立的條件爲在使用的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 => ...); 

添加到它的條件,但這些通常由與運算分離。我需要ORs。

我該怎麼做?

託尼

編輯:

我忘了提,查詢需要像這樣做的時候:

SELECT * FROM JOIN 訂閱版本。 。 。 WHERE <部分條件> AND(VersionCondition1 OR VersionCondition2 OR ...)

回答

2

最簡單的方法是不OR,因爲你可以使用Union得到同樣的結果:

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

這看起來很有希望!我會給這個鏡頭看看它是否有效。 – 2011-12-17 21:14:10

+0

是那個query.Whwere在foreach中的第一行應該是originalQuery.Where? – 2011-12-17 23:51:59

+0

@TonyVitabile是的,謝謝你的發現。我已經更新了我的答案。 – hvd 2011-12-17 23:53:49

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); 

它開始與.FALSE()如果你正在使用或者構造很重要您的查詢。這會給你一個基礎評估,以證明你可以建立在基礎之上。

相關問題