1

閉じる方法のヒントはありDataReaderますか?私はpostgresqlを使用しており、MARSはSQL専用です。あるいは、私が知らないこの問題に MARS は必要ないのかもしれません。エラーは foreach ループに表示されます。ヒントをありがとう。

var months = (from month in connector.PositionInstance where month.FeeNoticeMonth >= DateTime.Now.Month select month);

foreach (PositionInstance p in months)
{
    System.Windows.MessageBox.Show("" + p.First().Position.Name);
}

編集:私は2つのテーブルPositionInstanceとPositionを持っています:

CREATE TABLE "Position"
(
"PositionId" integer NOT NULL DEFAULT,
"Name" character varying(30) NOT NULL,
CONSTRAINT "PK_Position" PRIMARY KEY ("PositionId")
)

CREATE TABLE "PositionInstance"
(
"PositionInstanceId" integer NOT NULL DEFAULT,
"FeeNoticeYear" integer NOT NULL,
"FeeNoticeMonth" integer NOT NULL,
CONSTRAINT "PK_PositionInstance" PRIMARY KEY ("PositionInstanceId"),
CONSTRAINT "FK_Position_PositionInstance" FOREIGN KEY ("PositionId")
REFERENCES "Position" ("PositionId") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION 
)
4

2 に答える 2

2

foreachこの問題は、ループ内で発生している遅延読み込みが原因で、おそらくあなたのケースで発生しています。Positionループの各反復で DB からそれぞれをロードしようとしています。

これを回避する 1 つの方法は、熱心な読み込みを使用しPositionsて、クエリで一度にすべてを取得することです。次に、クエリの最後などで貪欲な操作も使用するToList()と、DB が実行され、すべてが一度にプルされます。あなたの場合、次のようなものを試してください

var months = 
    (from month in connector.PositionInstance 
     where month.FeeNoticeMonth >= DateTime.Now.Month 
     select month).Include("Position").ToList();

またはいくつかのバリエーション。ToList()クエリの後に use を使用すると、変数は DB から入力された結果を含むmonths として型付けされますList(これは です)。IEnumerableそれ以外の場合monthsIQueryable、DB クエリがまだ実行されていません。

于 2013-05-14T15:18:21.217 に答える
1

これを接続文字列に追加してみてください:

MultipleActiveResultSets=真

于 2013-04-10T13:07:48.280 に答える