Кто-нибудь знает, как воспроизвести функцию NVL () в linq - PullRequest
4 голосов
/ 06 апреля 2011

Так что мне нужно сделать запрос, где мне нужно несколько NVL, но мне нужно сделать это в linq (если это помогает, когда бэкэнд db - BD2, и мы используем subsonic), я искал в Интернете «NVL linq» и действительно не нашел ничего полезного, поэтому я спрашиваю здесь,

Спасибо за вашу помощь ...

Ответы [ 2 ]

8 голосов
/ 06 апреля 2011

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

var abs = from row in table
          select new {a = row.a ?? "default", b = row.b};

Оператор смотрит на значение слева и, если оно равно нулю, то использует значение справа. Таким образом, в примере, если row.a равно нулю, a становится "default".

Предполагается, что row.a является строкой.

0 голосов
/ 08 апреля 2011

Если кто-то хочет знать, как я это сделал, я не использовал оператор null coalesce ... Это было еще проще. Возможно, я не объяснил себя сам, но мне нужно было сказать, что если значение равно нулю, значит, я хочу включить этот результат. Проверьте это.

 possibleVendors = (from vndMapping in db.COMPANIES_VND_MAPPINGS
                     join v in db.COMPANIES_CMP_COMPANIES on vndMapping.VENDOR_ID equals v.COMPANY_ID
                     where
                     !(from ex in db.COMPANIES_VND_MAPPINGS
                        where (ex.OEM_ID == oemId || ex.OEM_ID == null)
                        && (ex.MODEL_ID == modelId || ex.MODEL_ID == null)
                        && (ex.MODALITY_ID == modalityId || ex.MODALITY_ID == null)
                        && (ex.CLASS_ID == productTypeId || ex.CLASS_ID == null)
                        && ex.EXCLUDE.ToUpper().Equals("Y")
                        select ex.VENDOR_ID).Contains(vndMapping.VENDOR_ID)
                     && (vndMapping.OEM_ID == oemId || vndMapping.OEM_ID == null)
                     && (vndMapping.MODEL_ID == modelId || vndMapping.MODEL_ID == null)
                     && (vndMapping.MODALITY_ID == modalityId || vndMapping.MODALITY_ID == null)
                     && (vndMapping.CLASS_ID == productTypeId || vndMapping.CLASS_ID == null)
                     select new
                     {
                       vndMapping.VENDOR_ID,
                       v.COMPANY_NAME
                     }).Distinct().OrderBy(x => x.VENDOR_ID).ToDictionary(x => x.VENDOR_ID, x => x.COMPANY_NAME);

Теперь имейте в виду - у меня было несколько ограничений в том, что я не проектировал бизнес-логику (очевидно) или базу данных - у кого-то еще мог бы быть лучший способ сделать это, если бы у вас был полный контроль над всем, это кажется работать хотя.

...