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