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?