我的查询如下所示:
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,但Quantity和Price不为null,则整个Description字段将变为null。
有没有人遇到过这种怪癖?有人知道有什么方法可以让它显示“4x5.99”,而不只是设置为null吗?
任何帮助都将不胜感激,我一直在尝试解决这个问题,甚至不知道如何在google上真正搜索到这个问题。
发布于 2010-01-22 00:37:38
这不是LINQ-to-SQL的“怪癖”,这是标准的SQL行为。
如果我有这样的表达式:
columnA + columnB + columnC并且这些列中的任何一列都为null,则整个表达式将被计算为null。
您希望将空值合并为空字符串。试试这个:
select new
{
ProductId = p.ProductId,
Description = p.Quantity + " x " +
p.Price + ", " +
(p.ItemDescription ?? "")
}发布于 2010-01-22 00:37:17
在sql术语中,将null与任何其他值连接会导致null。
所以,你有两个选择。首先(这就是我的做法),修改表中的ItemDescription字段使其不可为空。设置一个类似'‘(空白)的默认值。问题就消失了。
第二种选择是,修改您的linq代码以合并ItemDescription字段,以便在基础值为空时发出一个空白。我不是linq的人,所以我不知道该怎么做。
第二种方法的问题之一是,它必须为products结果集中的每个记录运行联合函数,这可能会对性能造成负面影响。
发布于 2010-01-22 00:40:15
这不是一个怪癖,这是SQL server上的默认行为(您可以在连接上使用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 ?? "")
};https://stackoverflow.com/questions/2110920
复制相似问题