Не знаю, как сгенерировать нужный мне запрос с помощью Entity Framework 4 - PullRequest
2 голосов
/ 17 декабря 2011

У меня есть модель 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, но это таблица поиска и она не важна.

Кроме того, выНеобходимо знать, что значения, хранящиеся в столбцах «От» и «В» в таблице «Версии», представляют номера версий.Если столбец Кому не равен NULL, это означает, что конкретный элемент, представленный ObjectId, был удален из базы данных.

В моем коде C # мне нужно создать запрос.Существует словарь, который содержит одну запись для каждой комбинации идентификатора типа данных и номера версии.Мне нужно создать серию тестов, выполняемых OR, а не AND.

Обычно, чтобы построить условие в виде строки для использования в 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.Мне нужны операции.

Как мне это сделать?

Тони

Редактировать:

Я забыл упомянуть, что запрос должен выглядеть следующим образом, когдасделано:

SELECT * FROM Versions. Присоединяйтесь к подписчикам.,,ГДЕИ (VersionCondition1 ИЛИ VersionCondition2 ИЛИ...)

Ответы [ 2 ]

2 голосов
/ 17 декабря 2011

Самый простой способ - без 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 голосов
/ 17 декабря 2011

Посмотрите на 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 (), если вы используете OR для построения запроса. Это даст вам базовую оценку false, на которой вы можете основываться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...