Как сделать, чтобы два соединения генерировали один выбор? - PullRequest
1 голос
/ 03 февраля 2011

У меня сейчас 3 таблицы:

News
ID | Title

Tag
ID | Name

TaggedContent
ContentID | TagID

И у меня есть два объекта контекста: NewsEntities и TagsEntities

Я хочу выбрать все теги, используемые News, в моем приложении:

static void Main(string[] args)
{
    IEnumerable<dynamic> something = null;

    IEnumerable<News.Data.News> news = null;
    IEnumerable<Tags.Data.Tag> tags = null;
    IEnumerable<TaggedContent> tagged = null;

    using (var db = new NewsEntities())
    {
        news = db.News.ToList(); // 1 select
    }

    using (var db = new TagsEntities())
    {
        something = news.Join(db.TaggedContents.ToList(),
            n => n.ID,
            tc => tc.ContentID,
            (n, tc) => new { tc.TagID }); // 1 select

        something = something.Join(db.Tags.ToList(),
            tid => tid.TagID,
            t => t.ID,
            (tid, t) => t); // 1 select
    }

    var result = something;
}

В настоящее время я генерирую 3 выбора. Как я могу уменьшить его до 2? Или, если возможно, я бы хотел уменьшить его до 1 без объединения сущностей.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Так как вы объединяете сущности из разных контекстов, вам не может обойтись менее 2 выбор.

Ваше объединение - это простая проверка личности, поэтому вы можете сделать это:

var ids = db.News.Select(x => x.ID).ToList();

Теперь у вас есть локальная копия всех идентификаторов в таблице новостей - первый выбор. Затем измените ваше первое «что-то» на:

something = db.TaggedContents
    .Where(x => ids.Contains(x.ContentID))
    .Select(x => new { x.TagID });

Этот второй оператор сам по себе не генерирует выбор из-за отложенного выполнения. Теперь вы можете удалить ToList() в третьем выражении:

something = something.Join(db.Tags,
    tid => tid.TagID,
    t => t.ID,
    (tid, t) => t);

И когда вы, наконец, перечислите число something, у вас будет второй выбор.

0 голосов
/ 03 февраля 2011

Использование класса DataLoadOptions, переданного при создании вашего DataContext.

       DataLoadOptions options = new DataLoadOptions();
       db.LoadOptions = options;
       options.LoadWith((News n) => n.Tags);

Так что присоединитесь к оставшимся данным.

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