不知道如何使用Entity Framework 4生成我需要的查询

时间:2011-12-17 17:15:48

标签: c# linq entity-framework-4

我有一个Entity Framework 4模型。该模型中有2个表,订阅者和版本:

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

是的,还有第三个表DataTypes,但它是一个查找表&并不重要。

此外,您需要知道存储在From&中的值。 “版本”表中的列表示版本号。如果To列不为null,则表示已从数据库中删除ObjectId表示的特定项。

在我的C#代码中,我需要构建一个查询。有一个词典,其中包含每个数据类型ID和组合的组合的一个条目。版本号。我需要构建一系列由OR进行测试的测试,而不是AND。

通常,要将条件构建为在DbCommand中使用的字符串,我会使用如下代码:

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

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

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

但是,我不知道如何使用实体框架将OR输入到查询中。我知道我的查询将是一个通用的IQueryable对象,我使用

添加条件
query = query.Where( a => ... );

但这些通常由AND分开。我需要OR。

我该怎么做?

编辑:

我忘了提到完成后查询需要看起来像这样:

SELECT * FROM版本 加入订阅者。 。 。 在哪里&lt;某些条件&gt; AND(VersionCondition1 OR VersionCondition2 OR ...)

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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来构建查询,那么从。()开始是很重要的。这将为您提供可以构建的基础评估。