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]));

我有两个问题。第一个是当我尝试评估查询时出现“不支持调用”异常。当我开始将其分解为更小的示例时,我遇到了另一个问题。

我尝试了一些简单的事情:

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')

它看起来不错,但是这是我遇到第二个问题的地方。我收到此错误:“第 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 中的查询上时,我看到的只是 {FluentCassandra.Linq.CqlQuery},而不是看到 CQL。如果我尝试执行该查询,我会得到“不支持调用”异常。

有什么想法(除了手写我的 CQL)吗?

4

0 回答 0