LINQ-запрос для системы тегов: соответствует ли какой-либо из нескольких тегов? - PullRequest
2 голосов
/ 24 марта 2010

Я только начинаю с LINQ. Я создаю приложение Entity Framework, которое использует канонические модели Post и Tag. A Post содержит ID, Text и Tags, а Tag содержит ID, Name и Posts.

A предыдущий поток в StackOverflow показал, как запросить Post, который соответствует всем Tag объектам (A и B и C) в списке поиска. Но как мне запросить Post, который соответствует любому Tag (A или B или C) в списке? Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 25 марта 2010

Наткнулся на ответ сразу после того, как я опубликовал этот вопрос. PredicateBuilder на помощь!

Вот мой код, который использует PredicateBuilder. Он настроен как метод расширения:

public static IQueryable<Note> WhereContainsAnyTags(this IQueryable<Note> notes, IEnumerable<Tag> searchTags)
{
    // Initialize
    var predicate = PredicateBuilder.False<Note>();

    // Select Notes that contain any search Tags
    foreach (var searchTag in searchTags)
    {
        var tag = searchTag;
        predicate = predicate.Or(note => note.Tags.Any(t => t.Id == tag.Id));
    }

    // Set return value
    return notes.AsExpandable().Where(predicate);
}

А вот как я называю код:

searchResults = m_ViewModel.ObjectContext.Notes.WhereContainsAnyTags(m_ViewModel.SearchTags);
0 голосов
/ 25 марта 2010

Вы можете также сделать это с помощью Entity SQL

var post = ctx.Posts.Where("it.Tags.Id IN (1,2,3)");
0 голосов
/ 25 марта 2010

Не уверен, сработает ли это или нет, но в любом случае стоит попробовать, если вы уже используете WhereIn.

var posts = context.Tags.WhereIn(tag => tag.Name, acceptableValues)
                        .SelectMany(t => t.Posts);

WhereIn должен предоставить вам все теги, которые являются частью имени, а SelectMany должен предоставить вам все сообщения, содержащие эти теги.

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