Linq Nhibernate: невозможно получить значение из таблицы внешнего ключа - PullRequest
1 голос
/ 28 января 2012

Я схожу с ума от этого и буду очень признателен за помощь.

Представьте себе две таблицы, связанные внешним ключом:

шрифты FontColors

Мне нужно получить отчет FontColors на компьютере, в который также включена информация о таблице шрифтов. Очевидно, что через структуру сущностей я могу получить доступ к свойствам таблицы цветов шрифтов шрифтов следующим образом:

string fontName = FontColors.Fonts.Name;

Простой ... верно?

Теперь представьте, что я создал другой класс, который называется ComputerFontColors, например, для соответствия моей модели отчета, которую я буду отображать (кстати, отчет по Jquery Grid), который будет включать ту же информацию о Font и FontColors в дополнение к некоторой информации, полученной из моего Таблица описания компьютера.

Итак, чтобы заполнить этот класс ComputerFontColors, мы получим что-то вроде этого:

var computerFonts = from f in FontColors
                select new ComputerFontColors
{
  FontColor = f.Color,
  FontName = f.Fonts.Name,
  ComputerUsedOn = ComputerServices.GetByFontId(f.Fonts.Id)
}

Кажется, все так просто, как только можно, но по какой-то причине это просто не работает. Nhibernate Linq не нравится часть «ComputerUsedOn = ComputerServices.GetByFontId (f.Fonts.Id)» и просто продолжает возвращаться с ошибкой «Could not instantiate: FontFolors».

Способ ComputerServices.GetByFontId (f.Fonts.Id) само по себе работает нормально.

Запрос со статическим значением, добавленным в:

var computerFonts = from f in FontColors
                select new ComputerFontColors
{
  FontColor = f.Color,
  FontName = f.Fonts.Name,
  ComputerUsedOn = ComputerServices.GetByFontId(6)
}

отлично работает.

Но когда я их объединяю - код вылетает. Застрял на этом.

Заранее спасибо.

1 Ответ

1 голос
/ 28 января 2012

Для ударов попробуйте это:

var computerFonts = FontColors.AsEnumerable().Select(f =>
new ComputerFontColors
{
  FontColor = f.Color,
  FontName = f.Fonts.Name,
  ComputerUsedOn = ComputerServices.GetByFontId(f.Fonts.Id)
});

AsEnumerable заставляет проецироваться, используя стандартные методы Linq to Objects, то есть в памяти. Возможно, у Linq to NH возникли проблемы с пониманием того, что ваша проекция не может быть полностью выполнена в базе данных (учитывая, что ComputerServices.GetByFontId - это метод, который нельзя преобразовать в запрос).

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