Linq的FirstOrDefault可以作为其他类型吗?

时间:2012-07-11 14:23:31

标签: c# linq .net-4.0

我有这段代码:

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方式)。

3 个答案:

答案 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;

我认为这不是很有用。