Search code examples
.netignite

Apache.Ignite.LINQ howto query where condition on key


Is it possible to query a cache and restrict the key in the where condition? The following sample is simplified:

using (var ignite = Ignition.Start())
{
    var cache = ignite.GetOrCreateCache<int, string>(new CacheConfiguration("test-cache", typeof(string)));

    cache.Put(1, "abc");
    cache.Put(2, "abc2");

    // The next line works
    var resultOnValue = cache.AsCacheQueryable().Where(m => m.Value.EndsWith("2")).ToArray();
    // The next line throws an exception
    var resultOnKey = cache.AsCacheQueryable().Where(m => m.Key > 1).ToArray();
}

Exception

javax.cache.**CacheException**: **Failed to run map query remotely**.
    at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.query(GridReduceQueryExecutor.java:748)
    at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$8.iterator(IgniteH2Indexing.java:1212)
    at org.apache.ignite.internal.processors.cache.QueryCursorImpl.iterator(QueryCursorImpl.java:95)
    at org.apache.ignite.internal.processors.platform.cache.query.PlatformAbstractQueryCursor.processInLongOutLong(PlatformAbstractQueryCursor.java:147)
    at org.apache.ignite.internal.processors.platform.PlatformTargetProxyImpl.inLongOutLong(PlatformTargetProxyImpl.java:55)
Caused by: javax.cache.CacheException: Failed to execute map query on the node: 5917e973-9eb8-4ae6-8dc7-69788d29c518, class org.apache.ignite.IgniteCheckedException:**Failed to execute SQL query**.
    at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.fail(GridReduceQueryExecutor.java:274)
    at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.onFail(GridReduceQueryExecutor.java:264)
    at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.onMessage(GridReduceQueryExecutor.java:243)
    at org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor.sendError(GridMapQueryExecutor.java:854)
    at org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor.onQueryRequest0(GridMapQueryExecutor.java:731)
    at org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor.onQueryRequest(GridMapQueryExecutor.java:516)
    at org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor.onMessage(GridMapQueryExecutor.java:214)
    at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor$1.applyx(GridReduceQueryExecutor.java:153)
    at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor$1.applyx(GridReduceQueryExecutor.java:151)
    at org.apache.ignite.internal.util.lang.IgniteInClosure2X.apply(IgniteInClosure2X.java:38)
    at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.send(IgniteH2Indexing.java:2191)
    at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.send(GridReduceQueryExecutor.java:1420)
    at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.query(GridReduceQueryExecutor.java:733)
    ... 4 more

Solution

  • Solution: Use QueryEntity and define the type of your key and value.

    var cache = ignite.GetOrCreateCache<int, string>
        (new CacheConfiguration("test-cache", 
            new QueryEntity(typeof(int), typeof(string))));