讓我們假設我有這個類的一個實例。C#在foreach循環中繼續處理對象的實例
public class MyClass
{
public string LocationCode;
public string PickUpCode
}
還有另外一個類,需要一個List<MyClass>
作爲輸入並保存到數據庫。
現在我需要辦理一些業務規則:
例如,如果LocationCode是null
在List<MyClass>
這個項目必須跳過,foreach
循環必須continue
到列表中的下一個項目。
我已經寫了下面的代碼,並與null
LocationCode的項目確實是跳過,但因此當循環達到一個有效的項目,並繼續將其保存在數據庫中var instance = new SomeClass();
莫名其妙地保留在內存中,也保存所有以前跳過的實例var instance = new SomeClass();
。這意味着我在數據庫中有空條目。
我正在使用NHibernate和Evict
沒有縫隙做的伎倆。有什麼建議麼?
public void Save(List<MyClass> listOfItems)
{
using (UnitOfWork.Start())
{
var repository = new Repository();
try
{
foreach (var item in listOfItems.Select(i => i.Item).Where(item => item != null))
{
var instance = new SomeClass();
if (pickUpCode != null)
{
instance.PickUpCode = pickUpCode;
}
else
{
instance.PickUpCode = null;
}
if (locationCode != null)
{
instance.StartLocation = locationCode
}
else
{
UnitOfWork.CurrentSession.Evict(instance);
continue;
}
repository.SaveSomeClass(instance);
}
}
catch (Exception ex)
{
_log.Error(" Unhandled error", ex);
}
}
}
**因爲有人問,這裏的一對UnitOfWork.Start()
public static class UnitOfWork
{
public static IUnitOfWork Start();
}
public interface IUnitOfWork : IDisposable
{
bool IsInActiveTransaction { get; }
IUnitOfWorkFactory SessionFactory { get; }
IGenericTransaction BeginTransaction();
IGenericTransaction BeginTransaction(IsolationLevel isolationLevel);
void Flush();
void TransactionalFlush();
void TransactionalFlush(IsolationLevel isolationLevel);
}
你沒有錯過'如果檢查添加到您LINQ(!item.pickUpCode = NULL)'和' if(item.locationCode!= null)'? – Michael 2014-09-19 07:26:00
這是一個示例代碼。實際的更詳細。 – 2014-09-19 07:36:05