2

私はこのコードを持っています:

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

ただし、これは匿名型を返すため、デフォルト値はnull.

FirstOrDefaultタイプとして機能させたいint

したがって、レコードがない場合は 0 が返されます (デフォルトの動作は int です)。

出来ますか ?

ps(もちろん、条件で確認できますが、それでもlinqの方法を好みます)。

4

3 に答える 3

1

2つの実行パスで2つの異なるデータ型に式を評価させることはできません。また、それが可能であっても、varはdynamicとは異なるため、変数の型はコンパイラーによって推測されません。

于 2012-07-11T14:29:00.450 に答える
1

「何もない」ことを意味する匿名型を返し、null合体演算子を使用します。

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実際にanを返し、後でキャストした場合にのみ、匿名型の代わりにinを返すことができますobject(@recursiveの回答による)が、これは逆効果のようです。

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 に答える