与在LINQ中动态选择对象相关的问题

时间:2015-02-19 14:49:57

标签: c# .net linq entity-framework

我使用EntityFramework在MVC框架中使用Web应用程序。

我一直陷入必须根据运行时传递的某些值动态选择对象的情况。

我有以下代码:

public void GetReportData(int repNo)
{
    MotionSoftEntities msEntity = new MotionSoftEntities();

    object reportData = null;
    if (repNo == 1)
    {
        reportData = msEntity.REP_MM_DEMOGRAPHIC.AsEnumerable(); 
    }
    else if (repNo == 2)
    {
       reportData = msEntity.REP_MM_BIRTHDAY.AsEnumerable(); 
    }
    else if (repNo == 3)
    {
        reportData = msEntity.REP_MM_ARCMEMBER.AsEnumerable(); 
    }
    else if (repNo == 4)
    {
        reportData = msEntity.Rep_MM_BadAddress.AsEnumerable();
    }
}

在上面的代码中,四个实体表中的每一个都有MemberID Field Common。 获取reportData对象结果后,我必须将其与另一个Entity对象表连接,如下所示:

 var resultData = from c in reportData
                   join p in PG_MEMBER on c.MemberID equals p.MemberID

但上述加入代码不起作为reportData的类型Object 所以可以加入动态对象??

我试过以下:

private IEnumerable<T> FilterData<T>(object value) where T : class
{
    IEnumerable<T> obj = (IEnumerable<T>)value;

    var resultData = from c in obj.AsEnumerable()
                     join r in PG_MEMBER on c.Field<int>("MemberID") equals r.MemberID
                     select c;
}

但上面的代码也无效..

我怎样才能解决我的问题? 感谢

2 个答案:

答案 0 :(得分:3)

您正在尝试加入一个可以返回四种不同类型中的任何一种的查询,并假设它们都有效,因为它们按名称共享一个公共属性。您可以沿着动态,接口,反射等方向前进,但它们会使代码更难理解并引入运行时错误的风险。

我会将每种报告类型分解为单独的方法。是的,你会有一些代码重复,但它会让代码更容易理解(我怀疑你会在你认为的代码之间有更多不同的代码)并得到你工作的东西< / em>早点:

public void GetReport1Data()
{
    var reportData = msEntity.REP_MM_DEMOGRAPHIC.AsEnumerable(); 
    var resultData = from c in reportData
                   join p in PG_MEMBER on c.MemberID equals p.MemberID

    ... do other stuff

}

public void GetReport2Data()
{
    var reportData = msEntity.REP_MM_BIRTHDAY.AsEnumerable(); 
    var resultData = from c in reportData
                   join p in PG_MEMBER on c.MemberID equals p.MemberID

    ... do other stuff

}

..等等。

一旦你完成了工作,那么你可以通过重构,改变设计(如果需要)等来专注于使它更好。如果你努力改进它太复杂了,至少你有一些工作的东西可以依靠而不是试图找到完美的&#34;设计。

答案 1 :(得分:1)

可能的方法是使用dynamic。您需要将reportData更改为IEnumerable<object>而不是object。 (连接将在内存中执行)

IEnumerable<object> reportData;

var resultData = from c in reportData
                 join p in PG_MEMBER on ((dynamic)c).MemberID equals ((dynamic)p).MemberID