LINQ to SQL String Соединение с нулевым значением - PullRequest
2 голосов
/ 21 января 2010

Мой запрос выглядит так:

var products = from p in Products
               select new
               {
                  ProductId = p.ProductId,
                  Description = p.Quantity + " x " p.Price + ", " + p.ItemDescription
               };

Причина, по которой я присоединяюсь к описанию в запросе, заключается в том, что я делаю это для нескольких запросов / объектов, чтобы создать экран истории (вроде экрана аудита). Загрузка экрана заняла некоторое время, поэтому я беру все запросы и выполняю

products.Concat(otherProducts);

Скорость значительно увеличилась (2-3 минуты до 2-3 секунд), однако, если в примере p.ItemDescription (который является базой данных VARCHAR (50)), имеет значение null, но количество и цена не равны нулю, тогда все поле Описание становится пустым.

Кто-нибудь сталкивался с этой причудой? Кто-нибудь знает, как заставить его показывать «4 x 5,99» вместо того, чтобы просто установить его на ноль?

Буду признателен за любую помощь, я пытался обойти это немного, и даже не знаю, как на самом деле найти это в Google.

Ответы [ 4 ]

6 голосов
/ 21 января 2010

Это не «причуда» LINQ-to-SQL, это стандартное поведение SQL.

Если у меня есть выражение:

columnA + columnB + columnC

И любой из этих столбцов будет null, тогда все выражение будет оценено как null.

Вы хотите объединить нулевые значения в пустые строки. Попробуйте это:

select new
           {
              ProductId = p.ProductId,
              Description = p.Quantity + " x " + 
                            p.Price + ", " + 
                            (p.ItemDescription ?? "")
           }
2 голосов
/ 21 января 2010

Это не странность, это поведение по умолчанию на сервере SQL (вы можете использовать SET CONCAT_NULL_YIELDS_NULL ON|OFF в соединении, чтобы включить или отключить его).

Вы должны иметь возможность использовать что-то подобное, чтобы обойти это:

var products = from p in Products
               select new
               {
                  ProductId = p.ProductId,
                  Description = p.Quantity + " x " p.Price + ", " + (p.ItemDescription ?? "")
               };
2 голосов
/ 21 января 2010

В терминах sql конкатенация нуля с любым другим значением приводит к нулю.

Итак, у вас есть два варианта. Во-первых (и я бы так поступил), измените поле ItemDescription в вашей таблице, чтобы оно не могло быть пустым. Установите значение по умолчанию что-то вроде '' (пусто). Проблема уходит.

Второй вариант, измените свой код linq, чтобы объединить поле ItemDescription, чтобы выдать пробел, если базовое значение равно нулю. Я не парень Linq, поэтому я не уверен, как это сделать.

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

0 голосов
/ 21 января 2010

Попробуйте:

select new 
           { 
              ProductId = p.ProductId, 
              Description = string.Format(
                            "{0} x {1}, {2}", 
                            p.Quantity,  
                            p.Price,   
                            p.ItemDescription) 
           } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...