FastMember column order preservation
Asked Answered
T

2

5

When using TypeAccessor.Create FastMember always seems to return a list of the columns in alphabetic sorted order. Is it possible to tell it to preserve the ordering of the columns in the class?

for example:

var testClass = new { B = "1", A = "2" };

will return column A then B from GetMembers, I'd like to get it to preserve the ordering of B then A if possible.

Tound answered 16/11, 2016 at 9:25 Comment(5)
Curious, why exactly you need that?Drus
kind of like the bulk insert, but I'd like to be able to throw data into other data stores too, some of which might care about ordering. @DrusTound
Without heavy reflection I think you cannot do that. Deep inside FastMember library author orders properties by name and seems there is no way around it. If that is a requirement, you can either ask author to add such functionality, or not use this library at all.Drus
Other option would be to get properties with reflection once, yourself, and then reoder result of GetMembers manually.Drus
yeah @evk that might do the trickTound
T
2

Looks like Evk is right and it can't really be done via the standard APIs. In the interest of completeness I'll leave this as the answer.

Tound answered 17/11, 2016 at 14:45 Comment(1)
I ran into the same problem: passing a dt into a user defined table type for a stored procedure kept failing due to columns being ordered alphabetically but FastMember. Thanks for the feedback.Rosariorosarium
C
5

I created a fork of this project with column order option and added a PR to the original repository. OrdinalAttribute was added to specify columns order.

The ordinal attribute can be used as shown below:

        public class ObjectReaderWithDefinedColumnsOrderType
        {
            [Ordinal(1)]
            public byte C { get; set; }
            [Ordinal(0)]
            public int? D { get; set; }
        }
  • IDataReader object returned in ObjectReader.Create() will have columns order according to the defined attributes.
  • If the attribute is not defined in the source class then alphabetical order is used.
  • If two fields have the same Ordinal value then then alphabetical order is used.
  • If the attribute is defined only for some properties then the columns are sorted by the ordinal values and then in alphabetical order (properties with no attributes are considered as -1 ordinal).

You can use my for right away or wait until the PR is merged with the original repository.

Caress answered 29/3, 2019 at 1:28 Comment(4)
Has your pull request been processed yet?Sly
@Martin, yes, it has been merged to master.Caress
@Caress what the latest with this? Does it work?Loaning
@EmilijaVilijaTrečiokaitė yes, it works and merged. Please use latest version of the component.Caress
T
2

Looks like Evk is right and it can't really be done via the standard APIs. In the interest of completeness I'll leave this as the answer.

Tound answered 17/11, 2016 at 14:45 Comment(1)
I ran into the same problem: passing a dt into a user defined table type for a stored procedure kept failing due to columns being ordered alphabetically but FastMember. Thanks for the feedback.Rosariorosarium

© 2022 - 2024 — McMap. All rights reserved.