Запрос LINQ, способный идентифицировать строку в соединительной таблице с двумя переменными — как это сделать?

Я использую С#, linq и EF4.

Мне нужна помощь, чтобы написать запрос LINQ, который может идентифицировать строку в базе данных, используя две переменные для составного ПЕРВИЧНОГО КЛЮЧА.

Вот таблицы в моей базе данных, представленные в моей концептуальной модели:

Таблицы базы данных:

CmsContents
CmsCategories
CmsRelatedCategories (Pure Juction Table)

Тип объекта:

CmsContent
CmsCategory

Набор элементов:

CmsContents
CmsCategories

У меня есть некоторые навигационные свойства:

for CmsContents --> CmsCategories --> Return Collection of Cms CmsCategory
for CmsCategories --> CmsContents --> Return Collection of Cms CmsContents

Представлены данные в базе данных для Junction Table:

CategoryId     ContentId
7              1
7              2
9              2

Мне нужно идентифицировать ОДИН ОБЪЕКТ в таблице Pure Junction, используя две переменные, например, CategoryId и ContentId:

CategoryId     ContentId
9              2

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

CmsContent myContentObj = (CmsContent)context.CmsContents.Where(x => x.ContentId == myContentId);

Есть идеи, как это решить?


person GibboK    schedule 15.03.2011    source источник
comment
Не работает - неадекватное описание ошибки. В чем твоя проблема и чего ты хочешь? Экземпляр CmsCategory или экземпляр CmsContent?   -  person Daniel Hilgarth    schedule 15.03.2011
comment
привет, мне нужен экземпляр CmsContent   -  person GibboK    schedule 15.03.2011
comment
Если вы хотите получить одну строку, оба идентификатора должны быть известны, верно? Теперь вы тестируете только contentid, а не catagoryid.   -  person MarcelDevG    schedule 15.03.2011
comment
правильно, я знаю как contentid, так и catagoryid, и мне нужно использовать тему вместе, чтобы идентифицировать конкретную строку   -  person GibboK    schedule 15.03.2011
comment
@GibboK: ты уверен? Что такое PK таблицы CmsContents? Также посмотрите мой ответ и попробуйте, пожалуйста.   -  person Daniel Hilgarth    schedule 15.03.2011
comment
Вы не можете идентифицировать и удалить одну строку из таблицы соединений в своем коде, потому что она не представлена ​​сущностью. Это отношение.   -  person Ladislav Mrnka    schedule 15.03.2011
comment
Спасибо Даниил за ответ!   -  person GibboK    schedule 17.03.2011


Ответы (1)


Использовать это:

CmsContent myContentObj = context.CmsContents.Where(x => x.ContentId == myContentId).FirstOrDefault();

Я предположил, что ContentId — это полный первичный ключ для таблицы CmsContent. Это предположение должно быть правильным, потому что иначе ваша таблица отображения не имела бы никакого смысла.

Объяснение:
Ваш запрос не работает, так как where возвращает IEnumerable<CmsContent>, а не один экземпляр. Вот для чего предназначен FirstOrDefault: он возвращает первый найденный элемент или null (точнее default(CmsContent)), если элементы с указанным идентификатором контента не найдены.

person Daniel Hilgarth    schedule 15.03.2011