Как я могу преобразовать следующие запросы linq в (имеющие), как в SQL

Мои намерения состоят в том, чтобы агрегировать результаты, а не сужать их.

if (Request.QueryString["VenueType"] == null)
    Renders = _renderContext.Renders;
else
{
    List<int> venueTypeIds = Request.QueryString["VenueType"].Split(',')
        .Select(int.Parse).ToList();
    Renders = _renderContext.Renders.Where(v => venueTypeIds.Contains(v.VenueTypeId));
}

// SECOND CRITERION:
if (Request.QueryString["SearchTerm"] != null)
    Renders = Renders.Where(r => r.Title.ToLower()
        .Contains(Request.QueryString["SearchTerm"].ToLower()));

// ADDITIONAL CRITERION:
if (Request.QueryString["EventType"] != null)
{
    List<int> eventTypeIds = Request.QueryString["EventType"].Split(',')
        .Select(int.Parse).ToList();
    Renders = Renders.Where(w => eventTypeIds.Contains(w.EventTypeId));
}

if (Request.QueryString["DisplayFormat"] != null)
{
    List<int> displayFormatIds = Request.QueryString["DisplayFormat"].Split(',')
        .Select(int.Parse).ToList();
    Renders = Renders.Where(w => displayFormatIds.Contains(w.DisplayFormatId));
}

Строки запроса поступают из групп флажков, которые могут иметь от одной до многих опций. Результаты, которые я пытаюсь вернуть, не должны сужаться после первого набора критериев, а должны возвращать больше результатов.

Вопрос. Как использовать предложение where или предложение GroupBy для получения совокупности возвращаемых элементов, а не для сужения возвращаемых элементов?


person Eric Bishard    schedule 27.10.2014    source источник
comment
Я голосую за то, чтобы этот ответ был закрыт, потому что, хотя я задал вопрос, и у меня есть ответ, который мне помог. У него может быть небольшая синтаксическая ошибка, но мне это помогло. Другие проголосовали за него, и если другие думают, что это плохо, это должно быть плохо, хотя мне это очень помогло. Я не буду так много публиковать на Stack Overflow и вместо этого буду обращаться к своим коллегам за ответами на вопросы, о которых у меня есть вопросы. Спасибо, что поставили меня на место Stack Overflow!   -  person Eric Bishard    schedule 29.10.2014


Ответы (1)


Если я правильно понимаю ваш вопрос, вы можете постепенно строить свои результаты, что-то вроде этого (код сокращен для краткости)...

IQueryable query = from x in Context.Stuff
                   select x;

List<Stuff> output = List<Stuff>();

output = query.Where(r => r.Title).Contains("SearchTerm")).ToList();
output += query.Where(r => r.Title).Contains("DifferentSearchTerm")).ToList();

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

person Paul Zahra    schedule 27.10.2014
comment
@EricB Добро пожаловать, ключ здесь в том, чтобы сохранить первоначальный IQueryable нетронутым, а также извлекать результаты и эффективно объединять их в «выходную» переменную ... и не откладывать несколько педантичный элемент, который может преобладать ТАК. - person Paul Zahra; 27.10.2014
comment
И здесь linq с наличием и группировкой... euch stackoverflow.com/questions/18050386/ - person Paul Zahra; 27.10.2014