Programing

IEnumerable 내에서 항목 속성을 업데이트했지만 속성이 설정된 상태로 유지되지 않습니까?

crosscheck 2021. 1. 7. 19:41
반응형

IEnumerable 내에서 항목 속성을 업데이트했지만 속성이 설정된 상태로 유지되지 않습니까?


두 개의 테이블이 있습니다 : Transactions 및 TransactionAgents. TransactionAgents에는 TransactionID라는 트랜잭션에 대한 외래 키가 있습니다. 꽤 표준입니다.

이 코드도 있습니다.

BrokerManagerDataContext db = 새로운 BrokerManagerDataContext ();

var transactions = from t in db.Transactions
                   where t.SellingPrice != 0 
                   select t;

var taAgents = from ta in db.TransactionAgents
               select ta;

foreach (var transaction in transactions)
{
    foreach(var agent in taAgents)
    {
        agent.AgentCommission = ((transaction.CommissionPercent / 100) * (agent.CommissionPercent / 100) * transaction.SellingPrice) - agent.BrokerageSplit;
    } 
}

dataGridView1.DataSource = taAgents;

기본적으로 TransactionAgent에는 내 데이터베이스의 모든 TransactionAgent에 대해 null 인 AgentCommission이라는 속성 / 열이 있습니다.

내 목표는에서 볼 수있는 수학을 수행하여 foreach(var agent in taAgents)각 에이전트의 값을 null이 아니도록 패치하는 것입니다.

이상하게도이 코드와 중단 점을 실행하면 agent.AgentCommission = (formula)AgentCommissision에 대해 값이 계산되고 개체가 업데이트되고 있지만 데이터 그리드에 표시 (테스트 용으로 만 사용됨) 된 후 계산 된 값이 표시되지 않습니다.

그래서 나에게 속성이 객체에 영구적으로 설정되지 않은 것 같습니다. 또한이 새로 업데이트 된 개체를 업데이트를 통해 데이터베이스에 다시 유지하면 계산 된 AgentCommission이 거기에 설정되지 않을 것입니다.

내 테이블이 같은 방식으로 설정되지 않은 상태에서 코드를보고 속성의 가치를 유지하지 않는 이유를 알 수있는 사람이 있습니까?


IEnumerable<T>s는 업데이트 된 값이 열거 형에 걸쳐 지속된다는 것을 보장 하지 않습니다 . 예를 들어 a List는 모든 반복에서 동일한 객체 집합을 반환하므로 속성을 업데이트하면 반복에서 저장됩니다. 그러나의 다른 많은 구현은 IEnumerable매번 새로운 객체 집합을 반환하므로 변경 사항이 지속되지 않습니다.

저장하고 결과를 업데이트해야하는 경우, 풀 IEnumerable<T>A를 아래로 List<T>사용 .ToList()하거나 새로 투사 IEnumerable<T>하여 .Select()적용되는 변경.


특히 문제는 IEnumerable에 액세스 할 때마다 컬렉션에 대해 열거된다는 것입니다. 이 경우 컬렉션은 데이터베이스에 대한 호출입니다. 첫 번째 부분에서는 데이터베이스에서 값을 가져와 업데이트합니다. 두 번째 부분에서는 데이터베이스에서 값을 다시 가져 와서 데이터 소스로 설정합니다 (또는 열거자를 데이터 소스로 설정 한 다음 데이터베이스에서 값을 가져옵니다).

.ToList () 등을 사용하여 결과를 메모리에 유지하고 매번 동일한 컬렉션에 액세스합니다.


LINQ to SQL을 사용한다고 가정하고 EnableObjectTracking이 false이면 쿼리가 실행될 때마다 개체가 새로 생성됩니다. 그렇지 않으면 매번 동일한 개체 인스턴스를 얻고 변경 사항이 유지됩니다. 그러나 다른 사람들이 보여준 것처럼 쿼리를 여러 번 실행하는 대신 결과를 목록에 캐시하십시오. 원하는 작업을 얻을 수있을뿐만 아니라 데이터베이스 왕복 횟수도 줄어 듭니다.


수정하려는 항목을 목록에서 찾고, 사본을 추출하고, 사본을 수정하고 (카운트 속성을 증가시켜) 목록에서 원본을 제거하고 수정 된 사본을 추가해야한다는 것을 발견했습니다. var x = stats.Where (d => d.word == s) .FirstOrDefault (); var statCount = stats.IndexOf (x); x.count ++; stats.RemoveAt (statCount); stats.Add (x);

참조 URL : https://stackoverflow.com/questions/9104181/updating-an-item-property-within-ienumerable-but-the-property-doesnt-stay-set

반응형