Как выбрать ненулевые отношения из пустых отношений в Entity Framework - PullRequest
0 голосов
/ 17 февраля 2012

Я создаю инструмент отчетности, основанный на Entity Framework и библиотеке Скотта Гатри Dynamic Linq.

Я столкнулся с проблемой при попытке выбрать необнуляемое поле из связанной таблицы, когда связанная запись не всегда существует. Например, у меня есть таблица Участника, которая имеет обнуляемый внешний ключ для таблицы Team. Это потому, что некоторые участники будут в команде, а некоторые - нет. Загвоздка в том, что я хочу получить отчет, который показывает список участников вместе с некоторой информацией об их команде, ЕСЛИ они в команде. Один из столбцов в таблице команд не имеет значения nullable, поэтому, когда я пытаюсь выбрать его, используя стандартную или динамическую проекцию:

    var standardProjection = data.Select(i => new
    {
        i.FirstName,
        i.ParticipantTeam.CaptainPickupFlg <--- Non Nullable Boolean
    });

    var dynamicProjection = data.Select("new (FirstName, ParticipantTeam.CaptainPickupFlg)");

Я получаю сообщение об ошибке при попытке перечислить результаты:

"Ошибка приведения к типу значения" Boolean ", так как материализованное значение является нулевым. Либо универсальный параметр типа результата, либо запрос должен использовать обнуляемый тип."

Как я могу избежать этой ошибки и просто материализовать ParticipantTeam.CaptainPickupFlg просто как обнуляемый бул в анонимном типе?

Динамический Линк Скотту: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

1 Ответ

0 голосов
/ 17 февраля 2012
data.Where( i => i.ParticipantTeam != null ).Select( i=> new
    {
        i.FirstName,
        i.ParticipantTeam.CaptainPickupFlg
    });

Если вам нужны все участники, у вас есть два варианта:

  • Если вы можете позволить пустое поле в возвращенном анонимном типе:

    var standardProjection = data.Select(i => new
    {
        i.FirstName,
        CaptainPickupFlg = (bool?)i.ParticipantTeam.CaptainPickupFlg
    });
    
  • Если это не вариант для вас, вам следует выбрать значение по умолчанию для этого поля:

    var standardProjection = data.Select(i => new
    {
        i.FirstName,
        CaptainPickupFlg = ((bool?)i.ParticipantTeam.CaptainPickupFlg) ?? false
    });
    

    со значением по умолчанию false.

...