Как сделать простой запрос ИЛИ с помощью LINQ? - PullRequest
2 голосов
/ 27 января 2012

Я использую LINQ to Entities и пытаюсь выполнить простой запрос OR. У меня есть таблица «Ссылки», и когда я запускаю запрос, я хочу включить все ссылки, содержащие любой тег из списка тегов, и все ссылки, соответствующие поисковому запросу. Например:

var tags = new List<string>
{
    "games",
    "events",
    "recipes"
};

var searchTerms = new List<string>
{
    "hockey",
    "barbecue",
    "cheesecake",
    "basketball"
}

var links = _entityContainer.Links
    .Where(x => x.Tags.Any(y => tags.Contains(y.Name))
    .Where(x => searchTerms.Any(y => x.Title.Contains(y)));

Примечание: объект ссылки имеет свойство навигации, называемое Tags, поэтому в первом .Where() я проверяю каждый из тегов в коллекции ссылки, чтобы увидеть, содержит ли список тегов, которые я ищу, один из их.

Во втором .Where() я просто проверяю, содержит ли свойство заголовка ссылки какое-либо из условий поиска.

Моя проблема в том, что этот код включает в себя все ссылки, которые содержат хотя бы один тег из списка И соответствуют одному из условий поиска. Но я хочу включить оба вместе. Я хочу, чтобы мой список ссылок включал в себя все ссылки, которые соответствуют 1 или более тегам в списке ИЛИ соответствуют 1 или более поисковым запросам в списке.

У меня также есть проблема из-за tags.Contains() и searchTerms.Any(), потому что это вызовы, которые нельзя преобразовать в выражения для передачи в EF. Они сработали бы, если бы я сделал ToList(), но я не смогу этого сделать, так как это приведет к тому, что в память будет помещено очень большое количество записей.

Есть предложения по достижению моей цели?

1 Ответ

7 голосов
/ 27 января 2012

Конденсировать до одного условия Где:

var links = _entityContainer.Links
    .Where(x => 
        x.Tags.Any(y => tags.Contains(y.Name)) ||
        searchTerms.Any(y => x.Title.Contains(y)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...