Linq to SQL и источник данных Gridview
-
03-07-2019 - |
Вопрос
У меня есть вопрос, связанный с этим . Я не хочу делать вычисления (агрегацию), но мне нужно получить отображаемые значения из ассоциации. В моем коде C # я могу напрямую ссылаться на значение, потому что ограничение внешнего ключа заставило Linq генерировать всю необходимую проводку. Когда я указываю IQueryable в качестве свойства источника данных Gridview и ссылаюсь на то, что не является столбцом первичной сущности в наборе результатов, я получаю сообщение об ошибке, что столбец не существует. Как новичок в Linq, я предполагаю, что назначение неявно преобразует IQueryable в список, и ассоциации теряются. У меня такой вопрос: как это сделать?
Я предполагаю, что могу обойти это, написав параллельный запрос, возвращающий анонимный тип, который содержит все столбцы, которые мне нужны для вида сетки. Кажется, что, делая это, я бы избыточно хранил данные в памяти, которые у меня уже есть. Могу ли я на лету запрашивать структуры данных в памяти при назначении источника данных? Или есть более прямое решение?
Вид сетки должен отображать ассоциации медицинских групп врачей, а название ассоциации находится в справочной таблице.
IQueryable<Physician> ph =
from phys in db.Physicians
//from name in phys.PhysicianNames.DefaultIfEmpty()
//from lic in phys.PhysicianLicenseNums.DefaultIfEmpty()
//from addr in phys.PhysicianAddresses.DefaultIfEmpty()
//from npi in phys.PhysicianNPIs.DefaultIfEmpty()
//from assoc in phys.PhysicianMedGroups.DefaultIfEmpty()
where phys.BQID == bqid
select phys;
(источник: heeroz.com )
Итак, основываясь на ответе Дениса, я удалил все ненужные вещи из своего запроса. Я подумал, что, возможно, я не задаю правильный вопрос для начала.
В любом случае, на странице отображаются данные врача. Я хочу отобразить все связи медицинских групп в сетке (и позволить пользователю вставлять, редактировать и обновлять присоединения). Теперь я понимаю, что мне не нужно явно объединяться в этих других таблицах - Linq делает это для меня. Я могу получить доступ к номеру лицензии, который находится в отдельной таблице, ссылаясь на него через цепочку дочерних ассоциаций. Я не могу сослаться на название медицинской группы в сетке, что возвращает меня к моему вопросу:
AffiliationGrid.DataSource = ph.First().PhysicianMedGroups;
Это не работает, поскольку med_group_print_name недоступно для GridView:
A field or property with the name 'med_group_print_name' was not found on the
selected data source.
Опять же, терпите меня, если слишком очевидно, что я не понимаю Linq ... потому что я не понимаю.
Решение
Ваш запрос кажется странным. Вы должны попытаться просто отобразить
ph = from phys in db.Physicians
where phys.BQID == bqid
select phys;
в вашей сетке. Это должно работать. Кроме того, почему вызовы Load ()? Если DataContext не удаляется при привязке сетки, он вам не нужен.
Если у вас все еще есть проблемы, не могли бы вы опубликовать сообщение об ошибке, которое поможет ...
Часть 2
Проблема в том, что у вас имя фактически отсутствует в PhysMedGroup. Вам нужно перейти на один уровень вниз к MedGroupLookup, чтобы получить доступ к имени, так как это свойство этого класса.
В зависимости от используемой вами технологии (похоже, это WinForms или Web Forms), вам необходимо настроить привязку данных для доступа к MedGroupLookup.med_group_print_name.