プログラムで (セカンダリ インデックスと共に) 生成した列ファミリがあり、実行時に任意の数のパラメーターを使用してクエリを実行したいと考えています。次のコードを実行してこれを行いました。
var queryParams = new Dictionary<string, string>();
//populate queryParams
.
.
.
IQueryable<ICqlRow> query = family;
queryParams.Keys.ToList().ForEach(paramKey => query = query.Where(q => q[paramKey] == queryParams[paramKey]));
これには2つの問題があります。1 つ目は、クエリを評価しようとすると、「Call is not supported」という例外が発生することです。より小さな例に分解し始めると、別の問題に遭遇しました。
私は簡単なことを試しました:
query = query.Where(t => t["Param1"] == "Value1");
それはうまくいきました。生成された CQL は
SELECT *
FROM SampleColumnFamily
WHERE Param1 = 'Value1'
私は簡単な例を強化しようとしました:
query = query.Where(t => t["Param1"] == "Value1").Where(t => t["Param2"] == "Value2");
これが生み出した
SELECT *
FROM SampleColumnFamily
WHERE (Param1 = 'Value1' AND Param2 = 'Value2')
良さそうに見えますが、ここで 2 番目の問題に遭遇しました。次のエラーが表示されます:「3:6 入力 '(' で実行可能な代替手段がありません」。where 句の周りの () が気に入らなかったことが判明しました。 FluentCassandra の LINQ プロバイダーに問題がありますか?
ただし、「通話はサポートされていません」という例外には答えませんでした。さらに掘り下げた後、別のシナリオを思いつきました。
//This works
query.Where(t => t["Param1"] == "Value1");
//This doesn't
string p1 = "Param1";
query.Where(t => t[p1] == "Value1");
IDE でクエリにマウスを合わせると CQL が表示されず、{FluentCassandra.Linq.CqlQuery} しか表示されません。そのクエリを実行しようとすると、「Call is not supported」という例外が発生します。
アイデアはありますか (私の CQL を手書きする以外に)?