thedev
thedev

Reputation: 2906

Update variable in foreach

I have an issue related to updating an object by reference and not sure exactly what is going on.

I need to delete a list of rules and for logging I need to load another field

ruleItem.ReferencedItemValue = eventEntity.Title;

When

 builder.LogDelete(showRule, showRuleResource.ToAuditLog(), "Logic Rule");

is called the ReferencedItemValue is not populated.

Any ideas, suggestions, alternatives? Thanks

CODE:

public void DeleteCustomLogicRule(int[] ruleIds){
    var rules = uow.Context.ShowRules.Where(sr => ruleIds.Contains(sr.Id)).ToList();
    if (rules.Any())
    {
        var showId = rules.FirstOrDefault().ShowId;
        var builder = AuditBuilder.FromShowId(showId);
        rules.ForEach(showRule =>
        {
            var showRuleResource = ToShowRuleResource(showRule);
            FillReferenceValue(showRuleResource);
            builder.LogDelete(showRule, showRuleResource.ToAuditLog(), "Logic Rule");
            });
        uow.Context.SaveChanges();
        builder.ToDatabase();
    }
}

private void FillReferenceValue(ShowRuleResource showRuleResource)
{
    foreach (var ruleItem in showRuleResource.ItemsPredicateAppliesTo.ToList())
    {
        FillRuleItem(ruleItem);
    }
}

private void FillRuleItem(RuleItemResource ruleItem)
{
    var eventEntity = uow.Context.Events.FirstOrDefault(e => e.Id == ruleItem.ReferencedItemId.Value);
    if (eventEntity != null)
    ruleItem.ReferencedItemValue = eventEntity.Title;
}

Upvotes: 0

Views: 101

Answers (2)

hardsky
hardsky

Reputation: 514


Start to dig from this function

private void FillRuleItem(RuleItemResource ruleItem)

It seems like this exspressiion

var eventEntity = uow.Context.Events.FirstOrDefault(e => e.Id == ruleItem.ReferencedItemId.Value);

is null.

Upvotes: 1

Selman Genç
Selman Genç

Reputation: 101681

try this one:

rules.ForEach(showRule =>
    {
        var item = showRule;
        var showRuleResource = ToShowRuleResource(item);
        FillReferenceValue(showRuleResource);
        builder.LogDelete(item, showRuleResource.ToAuditLog(), "Logic Rule");
        });

Upvotes: 1

Related Questions