Получить только значение ключа из ассоциации EF - PullRequest
2 голосов
/ 23 мая 2011

Я установил связь «многие ко многим» между двумя таблицами, основываясь на третьей таблице, которая просто содержит пару значений ключа.Теперь я хотел бы сделать запрос, который группирует значения ключей правильных таблиц по левым сторонам без необходимости в других данных.

LeftTable { LeftID, LeftField1, LeftField2 } 
JoinTable { LeftID, RightID} 
RightTable { RightID, RightField1, RightField2 }

Есть ли способ по существу просто запросить JoinTable и получить все 'RightIDs'сгруппированы по 'LeftIDs' без SQL, пытающегося получить поля с любой стороны?JoinTable не является отдельной сущностью в модели, но сопоставлен с ассоциацией.

Я немного поэкспериментировал как с использованием ObjectQuery, так и с EntityCommand (ESQL), и оба, похоже, все еще загружаются вдругие поля, присоединяясь к RightTable, который мне не нужен.

Мой ESQL выглядит примерно так:

SELECT lt.LeftID, (SELECT rt.RightID
FROM NAVIGATE(lt, MyModel.LeftToRightAssoc, RightTable) as rt)
FROM MyEntities.LeftTable as lt;

, но сгенерированный SQL все еще выбирается в RightField1 и RightField2.

Неужели должен быть более простой способ сделать это?

1 Ответ

1 голос
/ 23 мая 2011

Предполагая, что ваш класс Left имеет свойство навигации Rights (набор Right сущностей), вы можете попробовать это:

var list = context.Lefts.Select(l => new
{
    LeftId = l.LeftId,
    RightIds = l.Rights.Select(r => r.RightId)
});

foreach (var item in list)
{
    Console.WriteLine("LeftId = {0}", item.LeftId);
    foreach (var rightId in item.RightIds)
    {
        Console.WriteLine("RightId = {0}", rightId);
    }
}

Вы получите коллекцию объектов анонимного типа, гдекаждый элемент имеет LeftId и набор соответствующих RightIds.Этот запрос не должен касаться других полей, таких как RightField1 и т. Д. Вместо анонимного типа вы также можете создать свой собственный тип и затем проецировать на этот тип в запросе выше.

...