Datastax C#驱动程序中的Cassandra timeuuid
什么样的C#类型与Datastax Cassandra C#驱动程序中的timeuuid等效 我正在编写一个简单的用户跟踪服务,希望访问最新的用户历史记录。我正在尝试创建与此create语句等效的表:Datastax C#驱动程序中的Cassandra timeuuid,c#,cassandra,driver,datastax,C#,Cassandra,Driver,Datastax,什么样的C#类型与Datastax Cassandra C#驱动程序中的timeuuid等效 我正在编写一个简单的用户跟踪服务,希望访问最新的用户历史记录。我正在尝试创建与此create语句等效的表: 如果不存在用户历史记录,则创建表( 用户id文本, 事件类型文本, 创建_date timeuuid, 项目id文本, 主键((用户id、事件类型)、创建日期) ); 我上过以下课程: [允许过滤] [表(“用户历史记录”)] 公共类用户历史记录 { [分区键(1)] [列(“用户id”)] 公
如果不存在用户历史记录,则创建表(
用户id文本,
事件类型文本,
创建_date timeuuid,
项目id文本,
主键((用户id、事件类型)、创建日期)
);
我上过以下课程:
[允许过滤]
[表(“用户历史记录”)]
公共类用户历史记录
{
[分区键(1)]
[列(“用户id”)]
公共字符串用户标识;
[分区键(2)]
[列(“事件类型”)]
公共字符串事件类型;
[群集密钥(1)]
[列(“创建日期”)]
公共日期时间CreateDate{get;set;}
[列(“项目id”)]
公共字符串ItemID;
}
我用这个语句在Cassandra中创建表:
var table=Session.GetTable();
table.CreateIfNotExists();
但这给了我下表:
创建表用户历史记录(
用户id文本,
事件类型文本,
创建日期时间戳,
项目id文本,
主键((用户id、事件类型)、创建日期)
)
如您所见,create\u date
的类型是timestamp
,而不是timeuuid
我尝试了Guid
而不是DateTime
,但是当我调用.CreateIfNotExists()
时,这会给我一个uuid
对于
CreateDate
我是否应该使用Guid
而不是DateTime
,并使用原始CQL3显式创建表?我想这将允许我在Cassandra之间读写timeuuid
(使用FluentCassandra项目中的GuidGenerator
)?!(回想一下:我使用的是Datastax驱动程序)Timeuuid基本上是一个guid,因此您应该使用guid
“以下是在.NET中生成时间UUID或基于时间的Guid对象所需的所有代码。”
公共静态Guid GenerateTimeBasedGuid(DateTime DateTime)
{
long ticks=dateTime.ticks-gregorianalendarstart.ticks;
字节[]guid=新字节[ByteArraySize];
byte[]clockSequenceBytes=BitConverter.GetBytes(Convert.ToInt16(Environment.TickCount%Int16.MaxValue));
byte[]timestamp=BitConverter.GetBytes(ticks);
//复制节点
复制(节点,0,guid,节点字节,节点长度);
//复制时钟序列
复制(clockSequenceBytes,0,guid,GuidClockSequenceByte,clockSequenceBytes.Length);
//复制时间戳
复制(timestamp,0,guid,0,timestamp.Length);
//设置变量
guid[VariantByte]&=(字节)VariantByteMask;
guid[VariantByte]|=(字节)VariantByteShift;
//设置版本
guid[VersionByte]&=(字节)versionByTemTask;
guid[VersionByte]|=(byte)((int)GuidVersion.timebase听起来像是通过手动创建表解决了问题
对于将来寻找此信息的人,由于BCL中没有表示类似Java的TimeUUID的本机类型,DataStax.NET驱动程序的2.1.3版本引入了一个TimeUUID
结构来帮助解决此方案。您可以找到。它有一个到System.Guid
的隐式转换,应该可以在如果您将LINQ驱动程序的表创建方法用作属性的返回类型,请使用它。您是否喜欢Cassandra?是的。到目前为止,我喜欢数据模型。我已将CreateDate更改为Guid,并使用原始CQL而不是table创建表。CreateIfNotExists().工作正常。在DataStax中有用于此的内置方法:Cassandra.TimeUuid.NewId(dateTime)事实上,卢克在下面的回答中也是这样说的……事实上,虽然OP没有指定他们使用的是哪个版本的DataStax,也就是说,它只在2.1.3中提供……因此,如果他们使用的是较低版本,他们可以按照上面的代码手动执行……无论如何,感谢所有不发表评论的人……我应该删除这个答案吗被称为答案?…即当时唯一帮助提问者的答案?@Stas Berkov Cassandra.TimeUuid.NewId(dateTime)对我来说很好。我使用的版本是[cqlsh 5.0.1 | Cassandra 3.5.0 | CQL spec 3.4.0 | Native protocol v4]
public static Guid GenerateTimeBasedGuid(DateTime dateTime)
{
long ticks = dateTime.Ticks - GregorianCalendarStart.Ticks;
byte[] guid = new byte[ByteArraySize];
byte[] clockSequenceBytes = BitConverter.GetBytes(Convert.ToInt16(Environment.TickCount % Int16.MaxValue));
byte[] timestamp = BitConverter.GetBytes(ticks);
// copy node
Array.Copy(Node, 0, guid, NodeByte, Node.Length);
// copy clock sequence
Array.Copy(clockSequenceBytes, 0, guid, GuidClockSequenceByte, clockSequenceBytes.Length);
// copy timestamp
Array.Copy(timestamp, 0, guid, 0, timestamp.Length);
// set the variant
guid[VariantByte] &= (byte)VariantByteMask;
guid[VariantByte] |= (byte)VariantByteShift;
// set the version
guid[VersionByte] &= (byte)VersionByteMask;
guid[VersionByte] |= (byte)((int)GuidVersion.TimeBased << VersionByteShift);
return new Guid(guid);
}