1

ドメインサービスのインクルードにwhere句を配置できないようです。そのため、いくつかのlookupGroupsに必要なデータを取得するためにいくつかのループを実行しています。

   var _lookupGroups = _lookupGroupRepository.All();
        var _lookupValues = _institutionLookupValueRepository.All().Where(x => x.InstitutionID == _userProfile.InstitutionID);

        int i = 0;

        foreach (var _group in _lookupGroups)
        {
            var _values = _lookupValues.Where(x => x.LookupGroupID == _group.LookupGroupID);

            foreach (var _value in _values)
            {
                _group.InstitutionLookupValues.Add(_value);

                i++;
            }

            Console.WriteLine(_group.GroupName + " " + i.ToString());
        }

        return _lookupGroups;

私が入れたカウンターは、私が見たものを検証するためのものでした。最初に繰り返すグループは、Statesです。私のカウンターは50と表示されますが、ナビゲーションプロパティは100と表示され、各機関に1セットの50が表示されます(2セットあります)。そのため、カウンターが50と表示されていても、すべてのルックアップ値を取得してナビゲーションプロパティに配置します。また、メタデータファイルのすべてのインクルードを削除しました。

明確にするために:lookupGroupsにアタッチされているlookupvaluesがあります。ルックアップ値は機関に割り当てられます。したがって、STATESのルックアップグループの値を取得すると、50個のルックアップ値が返されます。上記のコード。この行を実行すると_group.InstitutionLookupValues.Add(_value); 私のInstitutionLookupValues=100(機関に関係なくすべてのlookupValuesを取得します)。しかし、私のカウンターは50を示しています。どこかですべてのルックアップ値を取得していますが、特定の機関に関連付けられている値がわかりません。

4

1 に答える 1

3

これは、変更されたクロージャにアクセスしていることが原因だと思います。アクセスしていない場合でも、とにかくアクセスするべきではありません。この線

var _values = _lookupValues.Where(x => x.LookupGroupID == _group.LookupGroupID);

おそらく、あなたが思っていることをしていないでしょう(C#5でない限り)。ラムダはデリゲートであり、クロージャーは値ではなく変数を閉じます。これは、コード_group.LookupGroupIDが常に列挙子の最後の反復からの最後の値になることを意味します。したがって、1つのルックアップ値のみをフィルター処理します_group.LookupGroupID

ブロックを次のように変更してみてください。

foreach (var _group in _lookupGroups)
{
  var currentGroup = _group;    
  var _values = _lookupValues.Where(x => x.LookupGroupID == currentGroup.LookupGroupID);

  foreach (var _value in _values)
  {
     currentGroup.InstitutionLookupValues.Add(_value);

     i++;
  }

  Console.WriteLine(currentGroup.GroupName + " " + i.ToString());
}

それが問題の原因かどうかはわかりませんが、とにかく他の奇妙な効果が得られます。ループ内に独自の変数を作成することにより、生成された列挙子変数を閉じないようにします。

これに関するEricLippertの記事を見てください:有害であると考えられるループ変数を閉じる。この問題を知っている人が少ないのは驚くべきことです。

また、クエリを折りたたむことをお勧めします。

var _lookupValues = _institutionLookupValueRepository.All().Where(x => x.InstitutionID == _userProfile.InstitutionID);

ToList()、または同様のものを使用して。そうしないと、のループごとにこのクエリを再評価する_lookupGroupsことになります。クエリがデータベースに対するものであるか、ループが大きい場合、これはパフォーマンスに悪影響を与える可能性があります。

于 2012-04-11T22:11:11.127 に答える