LinqtoSQL/C#:在这种情况下如何使用三元语句

LinqtoSQL/C#:在这种情况下如何使用三元语句,c#,linq-to-sql,C#,Linq To Sql,我有以下Linq到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

我有以下Linq到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();
问题是年和月中都有一些空字符串。发生这种情况时,我想用“notavailable”替换空字符串。我试着做这样一个三元语句:

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.arnotequal(“,endItem.Year);
Assert.AreNotEqual(“,endItem.Month”)

测试


有什么建议吗?

为什么要比较格式化值和原始值

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

为什么要比较格式化值和原始值

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

我强烈建议改为在LINQ to对象中执行最终操作。将LINQ to SQL中需要的所有位投影到SQL中,然后使用
AsEnumerable
返回到LINQ to对象:

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

我强烈建议您改为在LINQ to对象中执行最后的操作。将LINQ to SQL中需要的所有位投影到SQL中,然后使用
AsEnumerable返回LINQ to对象:

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

这是有道理的。谢谢。这是有道理的。谢谢。我没有想过这样做,但当我尝试时,我得到了错误““==”运算符不能应用于int和string的oEPrand。“因此,这意味着您的
不是您所写的空字符串,而是
int
s。由于
int
s不能为空,所以测试总是失败。所有这一切都意味着你的数据源不知何故是错误的。我没有想过这样做,但当我尝试时,我得到了错误“不能将“==”运算符应用于int和string的oeprands。”因此这意味着你的
年和
月不是空字符串,正如你所写的,而是
int
s。由于
int
s不能为空,所以测试总是失败。所有这些都意味着你的数据源有点错误。