Satria Sudewo

Satria Sudewo

  • NA
  • 5
  • 7.2k

LINQ in the LightSwitch ...PreprocessQuery() method does not work with delegate.

Nov 22 2011 10:27 AM
I have problems in designing an extended query in the ...PreprocessQuery() Method of a LightSwitch query.

It does not seem to be a LINQ problem itself, but ... there is no LightSwitch Forum ;)
1st of all, I tell you in a simplified way, what works:

partial void NeedHelp_PreprocessQuery(bool Admin, ref IQueryable<Device> query)
{
  // Some code...
  query = query.Where<Device>(d => d.IsAvailable());
}


The query does not show any compile error and does what it should do.

Now, when I try to put the logic into a method and use its delegate in the query, there's no compile error either, but I get an exception. Here is the code:

private bool Logic(Device TheDevice, bool Admin)
{
  return Admin ? true : TheDevice.IsAvailable();
}
partial void NeedHelp_PreprocessQuery(bool Admin, ref IQueryable<Device> query)
{
  // Some code...
  Func<Device, bool, bool> LogicDelegate = new Func<Device, bool, bool>(this.Logic);
  query = query.Where<Device>(d => LogicDelegate(d, Admin));
}

The Exception is in German, I try to translate the essential:

The expression is not supported. Expression: Invoke(value(LightSwitchApplication.ApplicationDataService+<>c_DisplayClass4).LogicDelegate, d, value(LightSwitchApplication.ApplicationDataService+<>c_DisplayClass4).Admin) Message of inner exception: The type "ApplicationData.Implementation.Device" cannot be used for a parameter of type "LightSwitchApplication.Device".

Since I am only using "Device", I do not understand this confusion between ApplicationData.Implementation.Device and LightSwitchApplication.Device! What am I doing wrong? Or is this kind of call simply not possible in LightSwitch?


Answers (4)