c# - OrderBy on a Sub Collection using RavenDB -


i'm using ravendb within c# asp.net, , i'm having trouble applying orderby orders value within sub collection. basic example of model is:

public class record {     public string id { get; set; }      public string name {get; set; }      public field[] fields { get; set; } }  public class field {     public string name { get; set; }      public string value { get; set; } } 

this saves down ravendb so

{    "name": "a name of somesort"    "fields": [        {           "name": "colour",           "value": "red"        },        {           "name": "size",           "value": "large"        }    ] } 

imagining large amount of these records saved db, can page of data so

using (var session = documentstore.opensession("testdb")) {     var result = session.query<record>().skip(0).take(10).tolist(); } 

what i'd able sort records based on field value (for example: sort records on value of field name 'colour')

edit:

to explain further, im wanting achieve below, not allowed in ravendb need find alternative way of doing (if possible)

using (var session = documentstore.opensession("testdb")) {     var result = session.query<record>()                 .orderby(v => v.fields.first(f => f.name == "colour").value)                 .skip(0)                 .take(10)                 .tolist(); } 

this throws new argumentexception following message

invalid computation: v.fields.first(f => (f.name == "colour")).value. cannot use computation (only simple member expression allowed) in ravendb queries. 

so, ive managed working, sharing how did it.

i had create new index below

public class record_byfield : abstractindexcreationtask<record> {     public record_byfield()     {         map = records=> r in records                           select new                           {                               _ = r.fields                                  .select(field =>                                      createfield(field.name, field.value, false, true))                           };     } } 

this meant use lucenequery orderby on field value (in example, on values in colour field)

var result = session.advanced.lucenequery<record>("record/byfield")             .orderby("+colour")             .skip(0)             .take(10)             .tolist(); 

to order descending, can replace + prefix - prefix (-colour), , can pass field name order by.

for information on progmmatically installing indexes on specific database - see programmatically create index

for information on dynamic indexes - see http://ravendb.net/docs/2.0/client-api/advanced/dynamic-fields


Comments

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -