簡體   English   中英

在foreach循環中繼續執行后,C#處理對象的實例

[英]C# handle instance of an object after continue in foreach loop

假設我有一個此類的實例。

public class MyClass
{
    public string LocationCode;
    public string PickUpCode
}

還有另一個將List<MyClass>作為輸入並保存到DB的類。

現在,我需要應用一些業務規則:

例如,如果LocationCodenull ,則必須跳過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM