Быстрая загрузка / предварительная выборка многие ко многим без LoadOptions - Linq to Sql - PullRequest
1 голос
/ 18 декабря 2009

У меня есть ситуация, когда мне нужно предварительно выбрать некоторые объекты через отношения многие ко многим. Так что это похоже на классическую BlogPost <- BlogPostTag -> Tag ситуацию.

Да, я знаю о LoadOptions, но не могу его использовать, потому что это веб-приложение, и я использую один текстовый текст для каждого шаблона запроса.

Также кажется, что вы не можете использовать проекцию для предварительной выборки отношений "многие ко многим". Да? Нет * * 1006

Я хочу вернуть IQueryable<Tag> на основе набора Блогов. Лучшее, что я могу сделать, это заставить его вернуть IQueryable<IEnumerable<Tag>>, выполнив следующее:

public IQueryable<Tag> GetJobsCategories(IQueryable<BlogPost> blogPosts)
{
    var jobCats = from bp in blogPosts
                  select bp.BlogPostTags.Select(x => x.Tag);

    return jobCats;
}

Могу ли я сгладить это? Я что-то упускаю из виду? Есть ли другой подход, который я могу использовать?

И нет, я не могу изменить ORM; -)

1 Ответ

2 голосов
/ 18 декабря 2009

Это будет работать, вы можете просто развернуть запрос linq

public IQueryable<Tag> GetJobsCategories(IQueryable<BlogPost> blogPosts)
{
    return from bp in blogPosts
           from tag in bp.BlogPostTags
           select tag;
}

Если вы объявите метод как таковой:

public static IQueryable<Tag> GetJobsCategories(this IQueryable<BlogPost> blogPosts)

Вы можете использовать его как метод расширения для запросов. Например

myContext.BlogPosts.GetJobsCategories()
...