Вопрос

У меня есть запрос ниже LINQ, который принимает текстовое поле, которое может быть y, n или dbnull и заполняет логию? Параметр с помощью истинного, ложного или нулевого в зависимости от значения поля.

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-й аргументы встроенного, если должны быть одинакового типа или неявно конвертируемы друг к другу.

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

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

Это было полезно?

Решение

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

(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?. Отказ Я произвольно предпочитаю первый ..

Другие советы

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

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top