我有以下Linq to SQL:
var finalResults =
(from d in data
group d by new { d.LocationName, d.Year, d.Month, d.Denominator, d.Numerator } into groupItem
orderby groupItem.Key.Year, groupItem.Key.Month, groupItem.Key.LocationName
select new
{
IndicatorName = IndicatorName,
groupItem.Key.LocationName,
Year = string.Format("{0}", (int?)groupItem.Key.Year),
Month = string.Format("{0:00}", (int?)groupItem.Key.Month)
Numerator = groupItem.Sum(x => x.Numerator),
groupItem.Key.Denominator,
}).ToList();
问题是Year和Month都有一些空字符串。发生这种情况时,我想用“不可用”替换空字符串。我尝试做这样的三元声明:
Year = string.Format("{0}", (int?)groupItem.Key.Year) == "" ? "Not Available" : string.Format("{0}", (int?)groupItem.Key.Year),
Month = string.Format("{0:00}", (int?)groupItem.Key.Month) == "" ? "Not Available" : string.Format("{0:00}", (int?)groupItem.Key.Month),
我试图做的是“如果年(或月)有一个空字符串,显示”不可用“否则显示值
然而,这并没有做我想做的事情,因为我仍然失败了我的
Assert.AreNotEqual(“”,endItem.Year);
Assert.AreNotEqual(“”,endItem.Month);
测试。
有什么建议吗?
答案 0 :(得分:3)
我强烈建议在LINQ to Objects中进行最终操作。在LINQ to SQL中计划所需的所有位,然后使用AsEnumerable
返回LINQ to Objects:
var sqlQuery = from d in data
group d by new { d.LocationName, d.Year, d.Month,
d.Denominator, d.Numerator } into groupItem
orderby groupItem.Key.Year, groupItem.Key.Month,
groupItem.Key.LocationName
select new
{
IndicatorName,
groupItem.Key.LocationName,
groupItem.Key.Year,
groupItem.Key.Month,
Numerator = groupItem.Sum(x => x.Numerator),
groupItem.Key.Denominator,
};
var finalResult = sqlQuery.AsEnumerable()
.Select(item => new {
item.IndicatorName,
item.LocationName,
Year = item.Year == null ? "Not Available"
: item.Year.ToString(),
Month = item.Month == null ? "Not Available"
: item.Month.ToString("00"),
item.Numerator,
item.Denominator
})
.ToList();
当您使用LINQ to Objects时,更容易推断在复杂场景中会发生什么 - 您不必担心空值处理等方面的差异。
答案 1 :(得分:0)
为什么要比较格式化值和原始值?
Year = groupItem.Key.Year == "" ? "Not Available" : string.Format("{0}", (int?)groupItem.Key.Year),
Month = groupItem.Key.Month == "" ? "Not Available" : string.Format("{0:00}", (int?)groupItem.Key.Month),