我有一个我以编程方式生成的列系列(以及二级索引),现在想要在运行时使用任意数量的参数进行查询。我通过运行以下代码完成了这个:
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中查看鼠标时,我没有看到CQL,而是看到{FluentCassandra.Linq.CqlQuery}。如果我尝试执行该查询,则会收到“不支持呼叫”异常。
任何想法(除了亲自编写我的CQL)?