LINQ to SQL String使用空值连接

时间:2010-01-21 16:33:17

标签: c# linq-to-sql

我的查询如下:

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,但数量和价格如果不为null,则整个Description字段将变为null。

有没有人遇到过这个怪癖?任何人都知道如何让它显示“4 x 5.99”,而不是仅仅将其设置为null?

任何帮助都会受到赞赏,我一直试图解决这个问题,甚至不知道如何在谷歌上搜索这个。

4 个答案:

答案 0 :(得分:6)

这不是LINQ-to-SQL“quirk”,这是标准的SQL行为。

如果我有表达式:

columnA + columnB + columnC

这些列中的任何一列都是null,然后整个表达式将被评估为null

您希望将空值合并为空字符串。试试这个:

select new
           {
              ProductId = p.ProductId,
              Description = p.Quantity + " x " + 
                            p.Price + ", " + 
                            (p.ItemDescription ?? "")
           }

答案 1 :(得分:2)

在sql术语中,将null与任何其他值连接会导致null。

所以,你有两个选择。首先(这是我要去的方式),修改表中的ItemDescription字段不可为空。设置“'(空白)之类的默认值。问题消失了。

第二个选项,如果基础值为null,则修改您的linq代码以合并ItemDescription字段以发出空白。我不是一个linq家伙,所以我不确定如何做到这一点。

第二条路线的问题之一是它必须为产品结果集中的每条记录运行合并函数,这可能会对性能产生负面影响。

答案 2 :(得分:2)

这不是一个怪癖,这是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 ?? "")
               };

答案 3 :(得分:0)

尝试:

select new 
           { 
              ProductId = p.ProductId, 
              Description = string.Format(
                            "{0} x {1}, {2}", 
                            p.Quantity,  
                            p.Price,   
                            p.ItemDescription) 
           }