Reputation: 187
I keep getting this exception when performing a simple linq group query using the Redis OM library:
System.InvalidOperationException: 'Searches can only be performed on objects decorated with a RedisObjectDefinitionAttribute that specifies a particular index'
My code:
Agents = (RedisCollection<Agent>)RedisProvider.RedisCollection<Agent>();
var groups = Agents.GroupBy(x => x.AccountId);
foreach (var group in groups)
{
Console.WriteLine($"{group.Key}");
}
My indexed model:
[Document(StorageType = StorageType.Json, Prefixes = new[] { "Agent" })]
public class Agent
{
[RedisIdField]
[Indexed] public string Id { get; set; }
[Indexed(Sortable = true, Aggregatable = true)]
public int AccountId { get; set; }
}
The index is created in Redis and I am able to perform Where() queries in Linq successfully on the same redis collection, interestingly group.Count() also works correctly. It is just once I try to iterate over group items it throws this exception.
I've done some Googling but cannot find a solution or info on the 'Redis Object Definition Attribute' the exception.
Upvotes: 1
Views: 364
Reputation: 1149
The issue is that you are trying to run a GroupBy
in Redis against the RedisCollection
, that's not a valid operation. You can materialize your collection (call ToList
or some other enumeration on it), prior to running the GroupBy, or you can run a GroupBy
in the context of a RedisAggregationSet, which will allow you to do run reductions against it.
The tradeoff here is if you want to run the GroupBy
post-materialization, you have to pull the whole result set back and have your app cobble everything into a group. If you do it within the context of the RedisAggregationSet
, all the processing can be done server side.
Upvotes: 2