1

タイプマッチングの問題で立ち往生しています。まず、次の項目と照合して構文が正しいことを確認しました。

Join/GroupJoin の適切な実装

すべての条件を代用しようとしましたが、タイプが一致しないことに気付きました。これが私のコードです:

        var waQ = someRepository.GetAllQ();
        var wrQ = someOtherRepository.GetAllQ();

        query = waQ
            .GroupJoin(wrQ,
                    wa => new { wa.someInt, wa.someNullableInt },
                    wr => new { wr.someMatchingInt, wr.someNonNullableInt },
                    (wa, wr) => new { wa, 
                        reqOrderID = wr.FirstOrDefault().someMatchingInt,
                        reqWorkerID = wr.FirstOrDefault().someNonNullableInt
                    })
            .Select([etc.]);

具体的には、使用法から型引数を推測できないというエラーが発生しています。根本的なエラーは、null 許容 int を null 非許容 int に一致させることができないということだと思います。

ただし、回避策を見つけるのに苦労しています。null 非許容の int を「int として」キャストしてみました。そして、私はこのエラーを受け取りました:

匿名型メンバー宣言子が無効です。匿名型のメンバーは、メンバーの割り当て、単純な名前、またはメンバー アクセスを使用して宣言する必要があります。

私も(int?)試して、両方を文字列(.ToString())としてキャストしようとしました。運がない。

誰か提案はありますか?

あなたが提案する前に、wa.someNullableIntをnull不可にすることは許可されていません。また、プログラムにとって意味がありません。

助けてくれてありがとう!

4

2 に答える 2

1

問題は、2 番目と 3 番目の引数がFunc<TOuter, TKey>and であることFunc<TInner, TKey>です。戻り値の型がまったく同じである必要がありますTKey。2 つの異なる匿名型new { wa.someInt, wa.someNullableInt }とがありnew { wr.someMatchingInt, wr.someNonNullableInt }ます。1 つのタイプを作成するには、フィールドに名前を付けて類似のタイプにキャストする必要があります。

query = waQ
        .GroupJoin(wrQ,
                wa => new { si = wa.someInt, nsi = wa.someNullableInt },
                wr => new { si = wr.someMatchingInt, nsi = (int?)wr.someNonNullableInt },
                (wa, wr) => new { wa, 
                    reqOrderID = wr.FirstOrDefault().someMatchingInt,
                    reqWorkerID = wr.FirstOrDefault().someNonNullableInt 
                })
        .Select([etc.]);
于 2013-09-30T03:25:57.493 に答える
1

キャストできるはずですがint?、既存の構文がセットアップされたときに自動的に取得されるのではなく、フィールドの名前を指定する必要があります。これを試すことについて言及しましたが、「そしてIntelliSenseはそれを好まなかった」という意味が明確ではありません。あなたが何を意味したかは、このエラーが発生したことだと思います:

匿名型メンバー宣言子が無効です。匿名型のメンバーは、メンバーの割り当て、単純な名前、またはメンバー アクセスを使用して宣言する必要があります。

次のようにキャストできるはずです。

wr => new
{
    wr.someMatchingInt,
    someNonNullableInt = (int?)wr.someNonNullableInt
}

そのsomeNonNullableInt =部分は、その項目に指定されたフィールド名になります。

于 2013-09-30T03:20:02.537 に答える