LinqtoSQL/C#:在这种情况下如何使用三元语句
我有以下Linq到SQL: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
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不能为空,所以测试总是失败。所有这些都意味着你的数据源有点错误。