2

我有这个代码:

var res1 = dtData.AsEnumerable()
            .Where(...)
            .Select(f => new { val = f["PremiumAfterUWDiscount"].ToDecimalOrZero(), 
                   idpolicy = f["IdPolicy"].ToString() })
            .FirstOrDefault();

然而,由于这返回一个匿名类型,它的默认值是null.

我希望它充当类型FirstOrDefaultint

所以如果没有记录,它将返回 0(默认行为为 int)。

是否可以 ?

ps(当然我可以在条件下检查它,但我仍然更喜欢 linq 方式)。

4

3 回答 3

1

您不能让表达式在两个执行路径上计算为 2 种不同的数据类型。此外,即使有可能, var 也不同于 dynamic,因此编译器不会推断出变量类型。

于 2012-07-11T14:29:00.450 回答
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();

如果您实际上返回 an并稍后强制转换(根据@recursive 的回答),则只能返回 anint代替匿名类型,但这对我来说似乎适得其反。object

FirstOrDefault不提供指定“默认”是什么的方法。

于 2012-07-11T14:30:46.643 回答
1

这样做没有任何意义,我鼓励你思考为什么要这样做,并找到一些更清洁、更直接的方法来完成它。

话虽如此,这是对@IronicMuffin 方法的一个小调整,它实际上会起作用。

object res1 = dtData.AsEnumerable()
    .Where(...)
    .Select(f => new { 
        val = f["PremiumAfterUWDiscount"].ToDecimalOrZero(), 
        idpolicy = f["IdPolicy"].ToString() 
    })
    .FirstOrDefault() as object ?? 0;

我不认为这很有用。

于 2012-07-11T14:56:38.740 回答