public enum EntityTypeId { JobManagement = 1, DocumentFolder = 2 }
public readonly struct EntityCompositeId {
public int TypeId { get; }
public long CompositeId => ((long)TypeId << 32) | (Id & 0x_00000000_ffffffff);
public EntityCompositeId(int typeId, int id) { TypeId = typeId; Id = id; }
public static explicit operator long(EntityCompositeId id) => id.CompositeId;
public static void Main() {
var jobManagement = new { Id = 10 };
var documentFolder = new { Id = 1000 };
var compKey1 = (long)(new EntityCompositeId((int)EntityTypeId.JobManagement, jobManagement.Id));
var compKey2 = (long)(new EntityCompositeId((int)EntityTypeId.DocumentFolder, documentFolder.Id));
var compKey3 = (long)(new EntityCompositeId(int.MaxValue, int.MaxValue));
var compKey4 = (long)(new EntityCompositeId(-int.MaxValue, -int.MaxValue));
Console.WriteLine("{0,15}{1,65}", nameof(EntityTypeId.JobManagement), ToBinary(compKey1));
Console.WriteLine("{0,15}{1,65}", nameof(EntityTypeId.DocumentFolder), ToBinary(compKey2));
Console.WriteLine("{0,15}{1,65}", "Positive max", ToBinary(compKey3));
Console.WriteLine("{0,15}{1,65}", "Negative max", ToBinary(compKey4));
static string ToBinary(long value)
=> Convert.ToString(value, 2).PadLeft(sizeof(long) * 8, '0');