我有一个以编程方式生成的列族(以及二级索引),现在想在运行时使用任意数量的参数对其进行查询。我通过运行以下代码来完成此操作:
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)吗?