Apache Ignite Linq over SQL



我设置了所有的缓存使用SQL api;我想用Linq来查询这些表中的数据。

如何正确地做到这一点?

这是我有的。我的模型是这样的:

public class Thing
{
[QuerySqlField]
public Guid Id { get; set; }
[QuerySqlField]
public string Name { get; set; }
[QuerySqlField]
public DateTime EffectiveDate { get; set; }
}

表的定义如下:

CREATE TABLE IF NOT EXISTS Things (
Id UUID,
Name VARCHAR,
EffectiveDate TIMESTAMP,
PRIMARY KEY(Id))
WITH ""
TEMPLATE = PARTITIONED,
CACHE_NAME = consoleappserver.Thing,
VALUE_TYPE = consoleappserver.Thing""

现在我正在尝试连接到

var cache = cli.GetCache<Guid, Thing>(typeof(Thing).FullName);
var things = cache.AsCacheQueryable();
var effectiveDate = DateTime.SpecifyKind(DateTime.Today, DateTimeKind.Utc);
things = things.Where(t => t.Value.EffectiveDate <= effectiveDate);
foreach (var kv in things)
{
Console.WriteLine("Things #{0} '{1}'",
kv.Value.Id, kv.Value.Name);
}
我得到以下错误,因为sql看起来像这样:
'Failed to parse query. Column "_T0.EffectiveDate" not found; SQL statement:
select _T0._KEY, _T0._VAL from "PUBLIC"."THINGS" as _T0 
where (_T0."EffectiveDate" <= ?) [42122-199]'

问题:Ignite将列名转换为大写,但LINQ提供者使用引号标识符,因此请求的列名EffectiveDate与实际的EFFECTIVEDATE不匹配。

解决方案1

在DDL查询中使用带引号的标识符,以便保留列名大小写:

CREATE TABLE IF NOT EXISTS Things (
"Id" UUID,
"Name" VARCHAR,
"EffectiveDate" TIMESTAMP,
PRIMARY KEY("Id"))
WITH ""
TEMPLATE = PARTITIONED,
CACHE_NAME = consoleappserver.Thing,
VALUE_TYPE = consoleappserver.Thing""

解决方案2

在模型类中指定大写列名:

public class Thing
{
[QuerySqlField(Name = "ID")]
public Guid Id { get; set; }
[QuerySqlField(Name = "NAME")]
public string Name { get; set; }
[QuerySqlField(Name = "EFFECTIVEDATE")]
public DateTime EffectiveDate { get; set; }
}

最新更新