使用反射和LINQ查询ApplicationDataService
本文关键字:查询 ApplicationDataService LINQ 反射 | 更新日期: 2023-09-27 18:20:33
我正在使用VS Lightswitch ServerApplicationContext访问和修改ApiController内的Lightswitch数据实体。
假设我有一个Customer实体,我可以使用linq:查询lightswitch数据库中的客户集合
IEnumerable<Customer> customers = from custs in serverContext.DataWorkspace
.ApplicationData
.Customers
.GetQuery()
.Execute()
where c.AProperty == aProperty
select custs;
或
IEnumerable<Customer> customers =
serverContext.DataWorkspace
.ApplicationData
.Customers
.Where(c => c.AProperty == aProperty)
.Execute();
这非常有效。
然而,我有更多的实体,每个项目中有几个不同实体的项目,我正在尝试创建一个库,允许我使用反射查询ServerApplicationContext
。
我已经使用反射来获取ServerApplicationContext
对象的属性,这使我可以访问EntitySet<T>
,但我不能对它执行任何查询。
这是目前的代码:
Type t = serverContext.DataWorkspace.ApplicationData.GetType();
PropertyInfo[] pInfo = t.GetProperties();
foreach (var p in pInfo)
{
// p is equal to {Microsoft.LightSwitch.Framework.EntitySet`1[LightSwitchApplication.Customer] Customers}
MethodInfo mInfo = p.PropertyType.GetMethod("GetQuery");
var result = mInfo.Invoke(p.PropertyType, null) ; //<-- Error Here
}
返回的错误为:
mscorlib.dll中出现类型为"System.Reflection.TargetException"的异常,但未在用户代码中进行处理附加信息:对象与目标类型不匹配。
有人喜欢使用反射查询EntitySets
(包括where子句)吗?
您试图调用GetQuery
MethodInfo
的部分有错误的目标-按照目前的编写方式,它试图在System.Type
的实例上调用GetQuery
方法(从p.PropertyType
获得),但这是行不通的。您需要做的是首先从serverContext.DataWorkspace.ApplicationData
获取EntitySet<T>
的实例,然后在该实例上调用GetQuery
方法。
Type t = serverContext.DataWorkspace.ApplicationData.GetType();
PropertyInfo[] pInfo = t.GetProperties();
foreach (var p in pInfo)
{
// p is equal to {Microsoft.LightSwitch.Framework.EntitySet`1[LightSwitchApplication.Customer] Customers}
MethodInfo mInfo = p.PropertyType.GetMethod("GetQuery");
var entitySet = p.GetValue(serverContext.DataWorkspace.ApplicationData); // new line
var result = mInfo.Invoke(entitySet, null); // updated line
}
有关如何针对EntitySet<T>
组合动态Where
子句的详细信息,请查看以下答案中的链接:https://stackoverflow.com/a/4799798/2611587.