2011-12-17 25 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()如果你正在使用或者构造很重要您的查询。这会给你一个基础评估,以证明你可以建立在基础之上。

相关问题