2009-09-08 5 views
4

Я использую C# .NET и LINQLINQ подключения Многие - Многие отношения

В моей модели LINQ У меня есть три таблицы базы данных:

LINQ MODEL http://img180.imageshack.us/img180/9827/linqmodel.jpg

ниже код, как я получить доступ к данным:

public IQueryable<tblAvailability> GetAvailabilitiesBySet(int id) 
    { 
     return (from a in dc.tblAvailabilities 
       where a.asID == id 
       select a).DefaultIfEmpty(); 
    } 

Отображение данных на экране (через ретранслятор). Однако я не могу получить доступ к «appTypeName», расположенному в tblAppointmentType. Я думал, что могу получить к нему доступ вот так:

<%#Eval("tblAvailabilities.tblAvailabilityAppointmentType.tblAppointmentType.appTypeName")%> 

Но это не позволит мне получить доступ к tblAppointmentType. Что я делаю не так?

Благодаря

Clare

+1

Пожалуйста, сообщите точное сообщение об ошибке. Из вашей модели данных и кода я не вижу, как это может быть то, что вы подразумеваете; Я бы предпочел, чтобы он жаловался на 'tblAvailabilities'. –

ответ

0

Я добавил еще один ретранслятор внутри первого ретранслятора с доступом к правильной таблице базы данных.

0

Вы не присоединился ни к одной из других таблиц, следовательно, результаты только возвращая tblAvailabilities строки.

var query = (from avail in dc.tblAvailabilitities 
     join aaTyp in dc.tblAvailabilityAppointmentType 
      on avail.availabilityID == aaType.availabilityID 
     join appType in dc.tblAppointmentType 
      on aaType.appTypeID == appType.appTypeID 
     select new { TypeName = appType.appTypeName }); 
0

С вашей текущей схеме, вы, возможно, придется несколько записей для tblAvailabilityAppointmentType на запись в tblAvailabilities. Это означает, что вам нужно получить конкретную запись, прежде чем пытаться связать ее с tblAppointmentType. Кроме того, вы не присоединяетесь к другим таблицам для извлечения строк (если вы хотите сделать это таким образом).

Как далеко, многие для многих действительно то, что вы хотите здесь? Ваше использование (а также концепции, которые я подразумеваю из вашего наименования), похоже, что вам нужны отношения от одного до многих. Возможно, много записей tblAvailabiliy, каждый из которых ссылается на один tblAppointmentType?

Если вам действительно нужно много, вы можете хорошо обслуживать расширение класса tblAvailabilities с помощью метода GetAppointmentTypes(). Вот a decent article on codeproject.

Othewise, убедитесь, что вы присоединитесь в других таблицах и ссылаться на правый ряд в tblAppointmentType

+0

Каждая доступность может иметь несколько типов назначения – ClareBear

3

Linq2SQL не обрабатывает много-2-Многие хорошо без небольшого держаться за руки ...

удалить связь между tblAvailabiltyAppointmentType и tblAppoitmentType. Создайте новую ссылку FROM tblAvailabiltyAppointmentType TO tblAppoitmentType. нажмите на эту новую ссылку, чтобы перейти к свойствам. измените Cardinality на OneToOne (так как вы не можете выбрать ManyToOne), откройте раздел Cild Property и измените имя на единицу.

теперь, когда вы выполняете запрос, который вы имеете в вопросе, объект tblAvailability будет иметь коллекцию tblAvailabilityAppointmentTypes, и каждый объект tblAvailabilityAppointmentType в этой коллекции будет иметь свойство объекта tblAppointmentType, который имеет поле appTypeName вы ищете ,

var appTypes = GetAvailabilitiesBySet(99).tblAvailabilityAppointmentTypes. 
    Select(a=>a.appTypeName); 
Смежные вопросы