1

DB からエンティティのリストを取得し、いくつかのプロパティを変更して、DB で更新しようとしました。

using (var cn = new SqlConnection(ConnectionString))
{
cn.Open();
var dataPredicate = Predicates.Field<Data>(f => f.Id, Operator.Eq, new [] {1, 2, 3}); // of course it's for an example 
var data = cn.GetList<Data>(dataPredicate);

foreach (var element in data)
{
     element.Status = StatusEnum.Pending;
     element.LastChange = DateTime.Now;
}

foreach (var activeRequest in data)
{
     cn.Update(activeRequest);
}
cn.Close();
}

私も試しました:

var updated = data.Select(s => new Data
{
     Id = s.Id,
     CreateDate = s.CreateDate,
     ForeignId = s.ForeignId,
     LastChange = DateTime.Now,
     Status = RequestStatus.Pending
 });

そして、InvalidOperationException: There is already an open DataReader associated with this Command を取得します。これを最初に閉じる必要があります。

その他の動作には問題ありません。

どうすれば正しく更新できますか?

4

1 に答える 1

1

cn.GetList<Data>(dataPredicate)戻り、実際のSQLクエリIEnumerableでそれを使用するたびに実行され、データを提供するために使用されます。foreachDataReaderIEnumerable

したがって、あなたの場合DataReader、2回実行しています.2回目は、まだ開いUpdateている同じ接続でクエリを実行しようとしています.DataReader

これが望ましい動作である場合 (データが多すぎて、 で 1 つずつロードしたい場合)、クエリDataReaderには別の接続を使用する必要があります。Update

別のオプションは、次のように、リストするすべてのデータをロードしてから、それを反復することです。

var data = cn.GetList<Data>(dataPredicate).ToList();
于 2014-02-26T08:41:02.967 に答える