0

プログラムで (セカンダリ インデックスと共に) 生成した列ファミリがあり、実行時に任意の数のパラメーターを使用してクエリを実行したいと考えています。次のコードを実行してこれを行いました。

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 を手書きする以外に)?

4

0 に答える 0