Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datastax C#驱动程序中的Cassandra timeuuid_C#_Cassandra_Driver_Datastax - Fatal编程技术网

Datastax C#驱动程序中的Cassandra timeuuid

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”)] 公

什么样的C#类型与Datastax Cassandra C#驱动程序中的timeuuid等效

我正在编写一个简单的用户跟踪服务,希望访问最新的用户历史记录。我正在尝试创建与此create语句等效的表:

如果不存在用户历史记录,则创建表(
用户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);
}