使用反射和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子句)吗?

使用反射和LINQ查询ApplicationDataService

您试图调用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.