-1

I have this armor table, that has three fields to identify individual designs: make, model and version.

I have to implement a search feature for our software, that lets a user search armors according to various criteria, among which their design.

Now, the users' idea of a design is a single string that contains make, model and version concatenated, so the entry is that single string. Let's say they want to look up the specifications for make FH, model TT, version 27, they'll think of (and type) "FHTT27".

We use an IQueryOver object, upon which we add successive conditions according to the criteria. For the design, our code is

z_quoQuery = z_quoQuery.And(armor => armor.make + armor.model + armor.version == z_strDesign);

Which raises an InvalidOperationException, "variable 'armor' of type 'IArmor' referenced from scope '', but it is not defined".

This is described as a bug here: https://github.com/mbdavid/LiteDB/issues/637

After a lot of trial and error, it seems that syntaxs that don't use the armor variable first raise that exception.

Obviously, I have to go another route at least for now, but after searching for some time I can't seem to find how. I thought of using something like

z_quoQuery = z_quoQuery.And(armor => armor.make == z_strDesign.SubString(0, 2).
                        And(armor => armor.model == z_strDesign.SubString(2, 2).
                        And(armor => armor.version == z_strDesign.SubString(4, 2);

Unfortunately, the fields are liable to have variable lengths. For instance, another set of values for make, model, and version might be, respectively, "NGI", "928", and "RX", that the code above would parse wrong. So I can't bypass the difficulty that way. Nor can I use a RegEx.

Neither can I make up a property in my Armor class that would concatenate all three properties, since it cannot be converted to SQL by NHibernate.

Has someone an idea of how to do it?

Maybe I should use an explicit SQL condition here, but how would it mix with other conditions?

Jean-David Lanz
  • 865
  • 9
  • 18

1 Answers1

1

It seems you can use Projections.Concat to solve your issue:

z_quoQuery = z_quoQuery.And(armor => Projections.Concat(armor.make, armor.model, armor.version) == z_strDesign);
Roman Artiukhin
  • 2,200
  • 1
  • 9
  • 19