【问题标题】:Using Reflection and LINQ to query the ApplicationDataService使用反射和 LINQ 查询 ApplicationDataService
【发布时间】:2014-09-04 18:55:04
【问题描述】:

我正在使用 VS Lightswitch ServerApplicationContext 来访问和修改 ApiController 中的 lightswitch 数据实体。

假设我有一个客户实体,我可以使用 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&lt;T&gt;,但我无法对其执行任何查询。

这是目前的代码:

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
}

返回的错误是:

“System.Reflection.TargetException”类型的异常发生在 mscorlib.dll 中,但未在用户代码中处理 附加信息:对象与目标类型不匹配。

有人对使用反射查询EntitySets(包括 where 子句)感到高兴吗?

【问题讨论】:

    标签: c# linq reflection visual-studio-lightswitch


    【解决方案1】:

    您尝试调用GetQuery MethodInfo 的部分有错误的目标 - 它当前的编写方式是尝试在System.Type 的实例上调用GetQuery 方法(从@987654326 获得@),这是行不通的。您需要做的是首先从serverContext.DataWorkspace.ApplicationData 获取EntitySet&lt;T&gt; 的实例,然后在该实例上调用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&lt;T&gt; 组合动态 Where 子句的详细信息,请查看此答案中的链接:https://stackoverflow.com/a/4799798/2611587。

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多