ExcelMapper icon indicating copy to clipboard operation
ExcelMapper copied to clipboard

Q: collection support?

Open sommmen opened this issue 3 years ago • 1 comments

Hiya,

I was excited to see nested object support in this library - i had some preliminary questions - if you know them out of the top of your head, please let me know:

  • Is writing nested objects supported?
  • Is there a max depth of nested objects?
  • Are collections of primitives/comples types supported?

Some info regarding my use-case: I have the following table in my view:

image

And i'd like to create an excel export - the data structure i have right now looks like this:

[DebuggerDisplay("{Month} {Damage} {Shortage} {OrderCount}")]
public class OperationalPerformanceDamageViewModel
{
    [Orderable, Filterable] public DateTime Month { get; set; }
    [Orderable, Filterable] public double DamagePerc { get; set; }
    [Orderable, Filterable] public int Damage { get; set; }
    [Orderable, Filterable] public double ShortagePerc { get; set; }
    [Orderable, Filterable] public int Shortage { get; set; }
    [Orderable, Filterable] public List<OperationalPerformanceDamagePerPartnerViewModel> DamagePerPartner { get; set; } = new();
    [Orderable, Filterable] public int OrderCount { get; set; }
}

[DebuggerDisplay("{PartnerGroupCode} {Damaged} {Shortage}")]
public class OperationalPerformanceDamagePerPartnerViewModel
{
    [Orderable, Filterable] public Guid PartnerGroupId { get; set; }
    [Orderable, Filterable] public string? PartnerGroupCode { get; set; }
    [Orderable, Filterable] public int Damaged { get; set; }
    [Orderable, Filterable] public int Shortage { get; set; }
    [Orderable, Filterable] public int Total { get; set; }
}

And i'd need to provide an excel export in some manner.

Edit; perhaps i could use a dynamic ExpandoObject to flatten the hiërarchy? something like:

var expandoObjectList = new List<ExpandoObject>();
var performanceDamageViewModels = q.ToList();
foreach (var viewModel in performanceDamageViewModels)
{
	dynamic expandoObject = new ExpandoObject();

	expandoObject.Month = viewModel.Month;
	expandoObject.DamagePerc = viewModel.DamagePerc;
	expandoObject.Damage = viewModel.Damage;
	expandoObject.ShortagePerc = viewModel.ShortagePerc;
	expandoObject.Shortage = viewModel.Shortage;
	expandoObject.OrderCount = viewModel.OrderCount;

	var expandoObjectAsDict = (IDictionary<string, object?>) expandoObject;

	foreach (var perPartnerViewModel in viewModel.DamagePerPartner)
	{
		if (perPartnerViewModel.PartnerGroupCode != null)
			expandoObjectAsDict.Add(perPartnerViewModel.PartnerGroupCode, perPartnerViewModel.Total);
	}

	expandoObjectList.Add(expandoObject);
}

sommmen avatar Aug 03 '22 12:08 sommmen

  • Saving nested objects is supported
  • There is no max depth
  • Collections are not supported out of the box (see #170, #134)

Re collections you might also try custom mapping.

mganss avatar Aug 03 '22 15:08 mganss

Re collections you might also try custom mapping.

Okay - thats too bad, but thanks for taking the time to answer my questions.

sommmen avatar Aug 09 '22 12:08 sommmen