在fluentcassandra中构建可能很长的LINQ查询

时间:2012-08-02 20:23:04

标签: c# cassandra fluentcassandra

我有一个我以编程方式生成的列系列(以及二级索引),现在想要在运行时使用任意数量的参数进行查询。我通过运行以下代码完成了这个:

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

0 个答案:

没有答案