LINQ to SQL: подфильтр, где условия - PullRequest
2 голосов
/ 12 октября 2011

Возможно, на этот вопрос где-то был дан ответ (и если да, я бы хотел получить ссылку!). Но поскольку я не знаю, какой тип запроса linq я пытаюсь выполнить, я не смог найти ничего, что могло бы мне помочь.

У меня уже есть очень простая настройка запроса для получения всех записей типа DomainSequence.

var query = db.DomainSequences;

Существуют разные типы доменных последовательностей. Я хочу получить их все. Однако для записей, которые имеют атрибут DomainType, равный «AT», я хочу вернуть только некоторые из записей «AT» (т. Е. Сделать предложение where для фильтрации записей «AT», но все же хочу вернуть все не AT записи.

Проще говоря, я хочу получить все записи DomainSequence, но для записей, которые имеют DomainType == "AT", возвращать их только в том случае, если они удовлетворяют определенным условиям.

Я могу придумать способ сделать это, выполнив что-то вроде:

 query.Where(x => x.DomainType != "AT" || (x.DomainType == "AT" && AT conditions....));

Я думаю, что это должно сработать, но проблема возникает, когда мне приходится выполнять подфильтры в других столбцах, а затем он начинает усложняться и усложняться очень быстро.

В идеале я хотел бы сделать что-то вроде

 query.Where(x => x.DomainType == "AT" || x.DomainType == "KS")
      .WhereIf(y => y.DomainType == "AT" then apply filter on those)
      .WhereIf(z => z.DomainType == "KS" then apply filter to these);

Я не уверен, есть ли способ сделать этот тип подфильтра в LINQ или в SQL (хотя я предполагаю, что есть). Любые предложения о том, как это можно сделать относительно чисто?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

Это на самом деле не так уж и отличается от того, что вы можете написать на SQL. На самом деле, если вы попробуете использовать синтаксический подход выражения запроса, вам может быть проще установить это конкретное соединение.

var query = from domain in db.DomainSequences 
            where (domain.DomainType == "AT" && domain.Foo == 42 && ...)
                || (domain.DomainType == "KS" && domain.Foo = 117 && ...)
            select domain;

Это хорошо сопоставляется с SQL, который вы могли бы написать

SELECT *
FROM DomainSequences
WHERE
    (DomainType = 'AT' AND Foo = 42 AND ...)
OR 
    (DomainType = 'KS' AND Foo = 117 AND ...)

Конечно, вы можете сохранить его в синтаксисе метода свободного расширения, используя лямбды, конечно, это всего лишь один вызов .Where(...), в конце концов.

1 голос
/ 12 октября 2011
query.Where(x => x.DomainType == "AT" || x.DomainType == "KS")
     .Where(y => y.DomainType != "AT" || other filter)
     .Where(z => z.DomainType != "KS" || other filter);
...