3

什么 C# 类型相当于 Datastax Cassandra C# 驱动程序中的 timeuuid?

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

CREATE TABLE IF NOT EXISTS user_history (
    user_id text,
    event_type text,
    create_date timeuuid,
    item_id text,
    PRIMARY KEY ((user_id, event_type), create_date)
);

我做了以下课程:

[AllowFiltering]
[Table("user_history")]
public class UserHistory
{
    [PartitionKey(1)]
    [Column("user_id")]
    public string UserID;

    [PartitionKey(2)]
    [Column("event_type")]
    public string EventType;

    [ClusteringKey(1)]
    [Column("create_date")]
    public DateTime CreateDate { get; set; }

    [Column("item_id")] 
    public string ItemID;
}

我正在使用这个语句在 Cassandra 中创建表:

var table = Session.GetTable<UserHistory>();
table.CreateIfNotExists();

但这给了我下表:

CREATE TABLE user_history (
  user_id text,
  event_type text,
  create_date timestamp,
  item_id text,
  PRIMARY KEY ((user_id, event_type), create_date)
)

正如你所看到的,类型create_datetimestamp而不是timeuuid

我试过Guid而不是DateTime,但这给了uuid我打电话的时候.CreateIfNotExists()

我应该使用原始 CQL3 来代替并显式创建表吗Guid?我想这将允许我从/向 Cassandra读写(使用在 FluentCassandra 项目中找到的)?!(回想一下:我正在使用 Datastax 驱动程序)DateTimeCreateDatetimeuuidGuidGenerator

4

2 回答 2

5

听起来您通过手动创建表解决了您的问题。

对于将来寻找此信息的人来说,由于我们在 BCL 中没有像 Java 那样表示 TimeUUID 的本机类型,因此 DataStax .NET 驱动程序的 2.1.3 版本引入了一个TimeUuid结构来帮助解决这种情况。你可以在这里找到源代码System.Guid如果您将其用作属性的返回类型,它具有与/从的隐式转换,并且应该与 LINQ 驱动程序的表创建方法一起使用。

于 2014-11-24T18:46:04.947 回答
5

Timeuuid 基本上是一个 guid,所以你应该使用一个 guid,下面的代码取自这里:creating-a-time-uuid-guid-in-net 并且是 FluentCassandra 项目的一部分

“以下是在 .NET 中生成时间 UUID 或基于时间的 Guid 对象所需的所有代码。”

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);
}
于 2014-02-25T15:57:47.373 回答