我有这段代码:
var res1 = dtData.AsEnumerable()
.Where(...)
.Select(f => new { val = f["PremiumAfterUWDiscount"].ToDecimalOrZero(),
idpolicy = f["IdPolicy"].ToString() })
.FirstOrDefault();
但是,由于这会返回匿名类型,因此其默认值为null
。
我希望FirstOrDefault
类型为int
。
所以如果没有记录,它将返回0(默认行为为int)。
有可能吗?
P.S。 (当然我可以在一个条件下检查它,但仍然,我更喜欢linq方式)。
答案 0 :(得分:1)
在两个执行路径上,您不能将表达式求值为2种不同的数据类型。 此外,即使可能,var也与动态不同,因此编译器不会推断变量类型。
答案 1 :(得分:1)
返回一个表示“无”的匿名类型,并使用空合并运算符:
var res1 = dtData.AsEnumerable()
.Where(...)
.Select(f => new { val = f["PremiumAfterUWDiscount"].ToDecimalOrZero(),
idpolicy = f["IdPolicy"].ToString() })
.FirstOrDefault() ?? new { val = 0, idpolicy = "" };
或DefaultIfEmpty
扩展方法:
var res1 = dtData.AsEnumerable()
.Where(...)
.Select(f => new { val = f["PremiumAfterUWDiscount"].ToDecimalOrZero(),
idpolicy = f["IdPolicy"].ToString() })
.DefaultIfEmpty(new { val = 0, idpolicy = "" })
.FirstOrDefault();
如果您实际上返回int
并稍后投出(根据@ recursive的答案),您将只能返回object
代替匿名类型,但这对我来说似乎反效果。
FirstOrDefault
没有提供指定“默认”的方法。
答案 2 :(得分:1)
这样做没有任何意义,我鼓励你思考为什么要这样做,并找到一些更清洁,更直接的方法来实现它。
话虽如此,这是对@ IronicMuffin的方法的一个小调整,它实际上会起作用。
object res1 = dtData.AsEnumerable()
.Where(...)
.Select(f => new {
val = f["PremiumAfterUWDiscount"].ToDecimalOrZero(),
idpolicy = f["IdPolicy"].ToString()
})
.FirstOrDefault() as object ?? 0;
我认为这不是很有用。