0

我有以下 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 = 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);

测试。

有什么建议吗?

4

2 回答 2

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 时,更容易推断在复杂场景中会发生什么 - 您无需担心 null 处理等方面的差异。

于 2012-07-30T20:43:00.303 回答
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),  
于 2012-07-30T20:42:23.217 回答