2014-02-25 36 views
0

我从DB我的实体列表中获取,更改一些属性并尝试在数据库中更新。如何使用Dapper扩展更新数组?

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异常:已经有一个用此命令,必须先关闭相关联的打开的DataReader。

我对其他操作没有任何问题。

如何正确更新它?

+0

'VAR数据= cn.GetList (dataPredicate).ToList();'尝试此 – Anri

+0

无关,但不需要'cn.Close();'在using语句中。 –

+0

@ v.shashenko我以同样的方式思考,但他们说的相反:[Dapper-Extensions on github](https://github.com/tmsmith/Dapper-Extensions) – lyha

回答

0

cn.GetList<Data>(dataPredicate)回报IEnumerable和每一个与你实际foreach SQL查询使用它的时候会被执行并且DataReader用于提供IEnumerable数据。

所以在你的情况下,你正在执行DataReader两次,第二次你试图做Update查询在同一连接与DataReader仍然打开。

如果这是理想的行为(太多的数据,并且您想要使用DataReader逐个加载它),则应该使用单独的连接进行Update查询。

另一选项将是加载所有的数据以列表,然后迭代槽,就像这样:

var data = cn.GetList<Data>(dataPredicate).ToList();