2012-07-30 279 views
0

使用三元聲明我有以下的LINQ to SQL:LinqtoSQL/C#:如何在這種情況下

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);

測試。

有什麼建議嗎?

回答

3

我強烈建議在LINQ to Objects中做最後的操作。項目你在LINQ需要SQL的所有位,然後用AsEnumerable要回LINQ到對象:

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對象在複雜的情況發生 - 你不需要擔心空處理差異等

+0

這是有道理的。謝謝。 – 2012-07-30 20:44:52

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), 
+0

我沒有考慮這樣做,但當我嘗試我得到的錯誤「The'=='運算符不能應用於int的oeprands和字符串「。 – 2012-07-30 20:49:51

+0

所以它意味着你的'Year'和'Month'不像你寫的那樣是空字符串,而是'int's。作爲int,它們不能爲空,所以這就是爲什麼你的測試總是失敗。所有這些意味着你的數據*源*在某種程度上是錯誤的。 – 2012-07-30 20:52:33