【问题标题】:Apache Ignite Linq over SQL基于 SQL 的 Apache Ignite Linq
【发布时间】:2021-11-21 19:17:42
【问题描述】:

我使用 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""

现在我正在尝试对此进行 linq

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

【问题讨论】:

  • 对我来说似乎工作正常。你有什么顾虑?尝试更复杂的方法,例如 cli.GetCache(typeof(Thing).FullName).Where(f => filter(f)).Select(record => record.Value.Field)
  • 我更新了问题以包含整个场景。

标签: c# sql linq .net-core ignite


【解决方案1】:

问题: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; }
}

【讨论】:

  • 我解决了这个问题,但遇到了另一个问题“无法在 .NET [platformId=1, typeId=298456301] 中解析 Java 类 'consoleappserver.Thing'。”
  • @herme0 请在单独的问题中提供详细信息
  • 我创建了一个新问题here
猜你喜欢
  • 2021-11-22
  • 2019-01-13
  • 2017-02-09
  • 2021-03-06
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
相关资源
最近更新 更多