使用具有通用查询性能高效的 AsCacheQueryable 从 Ignite 获取数据
Fetch data from Ignite using AsCacheQueryable with Generic query perfromance efficient
我正在尝试在我的 class CacheHandler
中添加 Where
函数以从 Ignite 缓存中获取数据
我正在寻找的是使通用查询与 AsCacheQueryable
和 Where
子句一起工作,以 return 来自 ignite 缓存的数据
//正在调用
var data = CacheHandler.Where2<LocalDb>(x => x.Value.localId== localId).FirstOrDefault();
//函数
public ICache<string, T> GetCache<T>()
{
var cacheName = CacheNames.GetCacheNameFromType<T>();
if (cacheName == "")
{
throw new Exception("Invalid Cache name");
}
return _ignite.GetCache<string, T>(cacheName);
}
public List<T> Where2<T>(Func<ICacheEntry<string, T>, bool> query)
{
// 'System.Collections.Generic.List<Apache.Ignite.Core.Cache.ICacheEntry<string, T>>'
var queryResult = GetCache<T>().AsCacheQueryable().Where(x => query(x));
if (queryResult == null)
{
return new List<T>();
}
return queryResult.Select(x => x.Value).ToList();
}
在上面的代码上下文中忽略下面错误中的 table 名称。但是在尝试获取数据时,所有 table 都会出现类似错误。
我在模型中的所有字段都有 [QuerySqlField]
我收到以下错误:
""Hwb_Entity_Cache"".ENTITY AS _T0 WHERE _T0._KEY,[*] _T0._VAL "; SQL statement:
select _T0._VAL from "Hwb_Entity_Cache".ENTITY as _T0 where _T0._KEY, _T0._VAL [42000-197] (6e3f4055)
Apache.Ignite.Core.Common.IgniteException: Failed to parse query. Syntax error in SQL statement "SELECT _T0._VAL FROM ""Hwb_Entity_Cache"".ENTITY AS _T0 WHERE _T0._KEY,[*] _T0._VAL "; SQL statement:
select _T0._VAL from "Hwb_Entity_Cache".ENTITY as _T0 where _T0._KEY, _T0._VAL [42000-197]
---> Apache.Ignite.Core.Common.JavaException: class org.apache.ignite.IgniteCheckedException: Failed to parse query. Syntax error in SQL statement "SELECT _T0._VAL FROM ""Hwb_Entity_Cache"".ENTITY AS _T0 WHERE _T0._KEY,[*] _T0._VAL "; SQL statement:
select _T0._VAL from "Hwb_Entity_Cache".ENTITY as _T0 where _T0._KEY, _T0._VAL [42000-197]
at org.apache.ignite.internal.processors.platform.utils.PlatformUtils.unwrapQueryException(PlatformUtils.java:520)
at org.apache.ignite.internal.processors.platform.cache.PlatformCache.runFieldsQuery(PlatformCache.java:1321)
at org.apache.ignite.internal.processors.platform.cache.PlatformCache.processInStreamOutObject(PlatformCache.java:940)
at org.apache.ignite.internal.processors.platform.PlatformTargetProxyImpl.inStreamOutObject(PlatformTargetProxyImpl.java:79)
Caused by: javax.cache.CacheException: Failed to parse query. Syntax error in SQL statement "SELECT _T0._VAL FROM ""Hwb_Entity_Cache"".ENTITY AS _T0 WHERE _T0._KEY,[*] _T0._VAL "; SQL statement:
select _T0._VAL from "Hwb_Entity_Cache".ENTITY as _T0 where _T0._KEY, _T0._VAL [42000-197]
at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:817)
at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.query(GatewayProtectedCacheProxy.java:412)
at org.apache.ignite.internal.processors.platform.cache.PlatformCache.runFieldsQuery(PlatformCache.java:1315)
... 2 more
Caused by: class org.apache.ignite.internal.processors.query.IgniteSQLException: Failed to parse query. Syntax error in SQL statement "SELECT _T0._VAL FROM ""Hwb_Entity_Cache"".ENTITY AS _T0 WHERE _T0._KEY,[*] _T0._VAL "; SQL statement:
select _T0._VAL from "Hwb_Entity_Cache".ENTITY as _T0 where _T0._KEY, _T0._VAL [42000-197]
at org.apache.ignite.internal.processors.query.h2.QueryParser.parseH2(QueryParser.java:584)
at org.apache.ignite.internal.processors.query.h2.QueryParser.parse0(QueryParser.java:210)
at org.apache.ignite.internal.processors.query.h2.QueryParser.parse(QueryParser.java:131)
at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.querySqlFields(IgniteH2Indexing.java:1103)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.applyx(GridQueryProcessor.java:2406)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.applyx(GridQueryProcessor.java:2402)
at org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:2919)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.lambda$querySqlFields(GridQueryProcessor.java:2422)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuerySafe(GridQueryProcessor.java:2460)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:2396)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:2323)
at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:802)
... 4 more
有人可以在此处建议更正传递和阅读查询的方式吗?
AsCacheQueryable
是 Ignite.NET LINQ 提供程序的一部分 - 它将 LINQ 表达式树 转换为 Ignite SQL 方言。上面代码的问题是 Func<ICacheEntry<string, T>, bool> query
- 它应该是 Expression<Func<ICacheEntry<string, T>, bool>> query
。这对我有用:
public List<T> Where2<T>(Expression<Func<ICacheEntry<string, T>, bool>> query)
{
var queryResult = GetCache<T>().AsCacheQueryable().Where(query);
return queryResult.Select(x => x.Value).ToList();
}
我正在尝试在我的 class CacheHandler
中添加 Where
函数以从 Ignite 缓存中获取数据
我正在寻找的是使通用查询与 AsCacheQueryable
和 Where
子句一起工作,以 return 来自 ignite 缓存的数据
//正在调用
var data = CacheHandler.Where2<LocalDb>(x => x.Value.localId== localId).FirstOrDefault();
//函数
public ICache<string, T> GetCache<T>()
{
var cacheName = CacheNames.GetCacheNameFromType<T>();
if (cacheName == "")
{
throw new Exception("Invalid Cache name");
}
return _ignite.GetCache<string, T>(cacheName);
}
public List<T> Where2<T>(Func<ICacheEntry<string, T>, bool> query)
{
// 'System.Collections.Generic.List<Apache.Ignite.Core.Cache.ICacheEntry<string, T>>'
var queryResult = GetCache<T>().AsCacheQueryable().Where(x => query(x));
if (queryResult == null)
{
return new List<T>();
}
return queryResult.Select(x => x.Value).ToList();
}
在上面的代码上下文中忽略下面错误中的 table 名称。但是在尝试获取数据时,所有 table 都会出现类似错误。
我在模型中的所有字段都有 [QuerySqlField]
我收到以下错误:
""Hwb_Entity_Cache"".ENTITY AS _T0 WHERE _T0._KEY,[*] _T0._VAL "; SQL statement:
select _T0._VAL from "Hwb_Entity_Cache".ENTITY as _T0 where _T0._KEY, _T0._VAL [42000-197] (6e3f4055)
Apache.Ignite.Core.Common.IgniteException: Failed to parse query. Syntax error in SQL statement "SELECT _T0._VAL FROM ""Hwb_Entity_Cache"".ENTITY AS _T0 WHERE _T0._KEY,[*] _T0._VAL "; SQL statement:
select _T0._VAL from "Hwb_Entity_Cache".ENTITY as _T0 where _T0._KEY, _T0._VAL [42000-197]
---> Apache.Ignite.Core.Common.JavaException: class org.apache.ignite.IgniteCheckedException: Failed to parse query. Syntax error in SQL statement "SELECT _T0._VAL FROM ""Hwb_Entity_Cache"".ENTITY AS _T0 WHERE _T0._KEY,[*] _T0._VAL "; SQL statement:
select _T0._VAL from "Hwb_Entity_Cache".ENTITY as _T0 where _T0._KEY, _T0._VAL [42000-197]
at org.apache.ignite.internal.processors.platform.utils.PlatformUtils.unwrapQueryException(PlatformUtils.java:520)
at org.apache.ignite.internal.processors.platform.cache.PlatformCache.runFieldsQuery(PlatformCache.java:1321)
at org.apache.ignite.internal.processors.platform.cache.PlatformCache.processInStreamOutObject(PlatformCache.java:940)
at org.apache.ignite.internal.processors.platform.PlatformTargetProxyImpl.inStreamOutObject(PlatformTargetProxyImpl.java:79)
Caused by: javax.cache.CacheException: Failed to parse query. Syntax error in SQL statement "SELECT _T0._VAL FROM ""Hwb_Entity_Cache"".ENTITY AS _T0 WHERE _T0._KEY,[*] _T0._VAL "; SQL statement:
select _T0._VAL from "Hwb_Entity_Cache".ENTITY as _T0 where _T0._KEY, _T0._VAL [42000-197]
at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:817)
at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.query(GatewayProtectedCacheProxy.java:412)
at org.apache.ignite.internal.processors.platform.cache.PlatformCache.runFieldsQuery(PlatformCache.java:1315)
... 2 more
Caused by: class org.apache.ignite.internal.processors.query.IgniteSQLException: Failed to parse query. Syntax error in SQL statement "SELECT _T0._VAL FROM ""Hwb_Entity_Cache"".ENTITY AS _T0 WHERE _T0._KEY,[*] _T0._VAL "; SQL statement:
select _T0._VAL from "Hwb_Entity_Cache".ENTITY as _T0 where _T0._KEY, _T0._VAL [42000-197]
at org.apache.ignite.internal.processors.query.h2.QueryParser.parseH2(QueryParser.java:584)
at org.apache.ignite.internal.processors.query.h2.QueryParser.parse0(QueryParser.java:210)
at org.apache.ignite.internal.processors.query.h2.QueryParser.parse(QueryParser.java:131)
at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.querySqlFields(IgniteH2Indexing.java:1103)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.applyx(GridQueryProcessor.java:2406)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.applyx(GridQueryProcessor.java:2402)
at org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:2919)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.lambda$querySqlFields(GridQueryProcessor.java:2422)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuerySafe(GridQueryProcessor.java:2460)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:2396)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:2323)
at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:802)
... 4 more
有人可以在此处建议更正传递和阅读查询的方式吗?
AsCacheQueryable
是 Ignite.NET LINQ 提供程序的一部分 - 它将 LINQ 表达式树 转换为 Ignite SQL 方言。上面代码的问题是 Func<ICacheEntry<string, T>, bool> query
- 它应该是 Expression<Func<ICacheEntry<string, T>, bool>> query
。这对我有用:
public List<T> Where2<T>(Expression<Func<ICacheEntry<string, T>, bool>> query)
{
var queryResult = GetCache<T>().AsCacheQueryable().Where(query);
return queryResult.Select(x => x.Value).ToList();
}