C # с использованием LINQ и Nullable Boolean - PullRequest
7 голосов
/ 06 июля 2010

У меня есть следующий запрос linq, который принимает текстовое поле, которое может быть Y, N или DBnull и заполняет логическое значение? параметр со значением True, False или null в зависимости от значения поля.

var dset = from i in tbdc.Talkbacks
       where i.talkback_id == id
       select new Talkback(
               i.talkback_id, i.acad_period, i.reference,
               i.staff_member, i.date_received, i.no_talkers,
               i.gender_id, i.names, i.type_id,
               i.method_id, i.area_id, i.site_id,
               i.category_id, i.date_closed, i.expenddate,
               i.acknowledgementtarget,
               (i.targetmet == "Y") ? true : 
                   ((i.targetmet == "N") ? false : null),
                   (i.acknowledgementtargetmet != "N") ? true : false

Проблемная строка -

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? false : null)

После прочтения я обнаружил некоторую документацию, в которой говорится, что 2-й и 3-й аргументы inline, если нужно, должны быть одного типа или неявно преобразовываться друг в друга.

Мой вопрос: как мне обойти это ограничение, чтобы достичь желаемого результата?

Я относительно новичок в C #, поэтому еще не знаком со всеми его особенностями / возможностями.

Ответы [ 2 ]

6 голосов
/ 06 июля 2010

Мое предложение будет заменить его на:

(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null;

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

Результаты true и false обрабатываются как литералы bool, а не bool?, поэтому неявно преобразуются в null. Приведение любых результатов к bool? сделает их сопоставимыми. Тот, который я предложил, имеет неявное преобразование между bool? и null, и это тоже работает:

(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null;

Что является неявным преобразованием между bool и bool?. Я произвольно предпочитаю первый ..

2 голосов
/ 06 июля 2010

Вы можете явно преобразовать одно или несколько выражений в bool?:

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)
...