5

Datastax C# ドライバーを使用して、timeuuid データ型の CQL クエリで「より大きい」または「より小さい」WHERE 条件を作成するにはどうすればよいですか?

タイムスタンプでソートされたCookie履歴をtimeuuidとして保存するためのテーブルがCassandraにあります。

CREATE TABLE cookie_history (
    cookie_id text,
    create_date timeuuid,
    item_id text,
    PRIMARY KEY ((cookie_id), create_date)
);

テーブルは、Datastax C# Cassandra ドライバーを使用してクエリを実行するために、C# クラスを使用してマップされます。

[Table("cookie_history")]
public class CookieHistoryDataEntry
{
    [PartitionKey(1)]
    [Column("cookie_id")]
    public string CookieID;

    [ClusteringKey(1)]
    [Column("create_date")]
    public Guid CreateDate;

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

特定の Cookie について、特定のタイム スタンプの後のすべてのアイテムが必要です。

        var myTimeUuid = new Guid("5812e74d-ba49-11e3-8d27-27303e6a4831");
        var table = session.GetTable<CookieHistoryDataEntry>();
        var query = table.Where(x => x.CookieID == myCookieId
                                  && x.CreateDate > myTimeUuid);

しかし、これ (x.CreateDate > myTimeUuid) を実行すると、コンパイル時にエラーが発生します。

Operator '>' cannot be applied to operands of type 'System.Guid' and 'System.Guid'
4

4 に答える 4

3

raw CQL の timeuuid で「より大きい」を使用することができます。したがって、1 つの解決策は、ドライバーから生の CQL を実行することです。

session.Execute(@"select * 
    from cookie_history 
    where cookie_id = 1242a96c-4bd4-8505-1bea-803784f80c18 
    and create_date > 5812e74d-ba49-11e3-8d27-27303e6a4831;");
于 2014-04-04T08:09:58.193 に答える
3

CompareTo() を使用すると、Linq を使用できます。

var query = table.Where(x => x.CookieID == myCookieId &&
                        x.CreateDate.CompareTo(myTimeUuid) > 0;

CompareTo を処理するコードは次のとおりです。

関連: Cassandra token() メソッドを使用する必要があるパーティション キーを比較する必要がある場合は、CqlToken.Create を使用して実行できます。

var query = table.Where(x => 
    CqlToken.Create(x.PartitionKeyProperty) >= CqlToken.Create(3);
于 2015-07-22T20:17:58.710 に答える
0

日付を実際の日付型ではなく Guid として表現しようとする理由はありますか? これが私が認識していない特殊なケースでない限り、Guid に関して、より大きいまたはより小さいという概念はありません。日付 A は、日付 B よりも大きい可能性があります。私がこれまでに見たすべてのことから、Guid には当てはまりません。

于 2014-04-02T20:38:21.900 に答える
0

QueryBuilder実際には、生の CQL だけでなく、次のことも可能です。

select.where(QueryBuilder.eq('cookie_id', cookie_id).  
  and(QueryBuilder.gt("create_date", 
      QueryBuilder.fcall("maxTimeuuid", 
          QueryBuilder.fcall("unixTimestampOf", 
              QueryBuilder.raw(timeuuid_as_string))));
于 2016-06-20T13:45:01.967 に答える