[英]object reference not set to an instance of an object in C# in foreach loop?
[英]C# handle instance of an object after continue in foreach loop
假設我有一個此類的實例。
public class MyClass
{
public string LocationCode;
public string PickUpCode
}
還有另一個將List<MyClass>
作為輸入並保存到DB的類。
現在,我需要應用一些業務規則:
例如,如果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);
}
您為什么不首先失敗並避免所有這些?
示例為:
foreach (var item in listOfItems.Select(i => i.Item).Where(item => item != null))
{
if (item.LocationCode == null){
continue;
}
var instance = new SomeClass();
if (pickUpCode != null)
{
instance.PickUpCode = pickUpCode;
}
else
{
instance.PickUpCode = null;
}
// if we reach here, location code is definitley not null, no need for the check
instance.StartLocation = locationCode
repository.SaveSomeClass(instance);
}
或者,您可以將支票添加到LINQ where子句中
foreach (var item in listOfItems.where(item=> item != null && item.LocationCode != null)
沒有關於UnitofWork.Start如何工作的更多代碼,很難提出建議。 但是,值得在SomeClass上實現IDisposable。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.