Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与在LINQ中动态选择对象相关的问题_C#_.net_Linq_Entity Framework - Fatal编程技术网

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

C# 与在LINQ中动态选择对象相关的问题,c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我有一个MVC框架和EntityFramework中的Web应用程序 我一直陷于这样的境地:我必须根据运行时传递的某个值动态地选择一个对象 我有以下代码: public void GetReportData(int repNo) { MotionSoftEntities msEntity = new MotionSoftEntities(); object reportData = null; if (repNo == 1) { reportDa

我有一个MVC框架和EntityFramework中的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字段Common。 现在,在获得reportData对象结果后,我必须将其与另一个实体对象表连接,如下所示:

 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;
}
private IEnumerable FilterData(对象值),其中T:class
{
IEnumerable obj=(IEnumerable)值;
var resultData=来自对象中的c.AsEnumerable()
将r加入c.Field上的PG_成员(“MemberID”)等于r.MemberID
选择c;
}
但是上面的代码也不起作用

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

您正在尝试加入一个查询,该查询可能返回四种不同类型中的任何一种,并假设它们都可以工作,因为它们按名称共享一个公共属性。您可以使用动态、接口、反射等方法,但它们会使代码更难理解,并带来运行时错误的风险

我会将每种报告类型分解为一个单独的方法。是的,您将有一些代码重复,但这将使代码更容易理解(我怀疑您认为它们之间的代码会有更多不同之处),并使您能够更快地完成工作:

。。等等


一旦你成功了,你就可以专注于通过重构、改变设计(如果必要的话)等方式使它变得更好。如果你改进它的努力变得过于复杂,至少你有一些可以依靠的东西,而不是陷入试图找到“完美”的陈规陋习设计。

您正在尝试加入一个查询,该查询可能返回四种不同类型中的任何一种,并假定它们都可以工作,因为它们按名称共享一个公共属性。您可以使用动态、接口、反射等方法,但它们会使代码更难理解,并带来运行时错误的风险

我会将每种报告类型分解为一个单独的方法。是的,您将有一些代码重复,但这将使代码更容易理解(我怀疑您认为它们之间的代码会有更多不同之处),并使您能够更快地完成工作:

。。等等


一旦你成功了,你就可以专注于通过重构、改变设计(如果必要的话)等方式使它变得更好。如果你改进它的努力变得过于复杂,至少你有一些可以依靠的东西,而不是陷入试图找到“完美”的陈规陋习设计。

一种可能的方法是使用
动态
。您需要将
reportData
更改为键入
IEnumerable
,而不是
object
。(连接将在内存中执行)

IEnumerable reportData;
var resultData=来自reportData中的c
在((动态)c.MemberID等于((动态)p.MemberID)的PG_成员中加入p

一种可能的方法是使用
动态
。您需要将
reportData
更改为键入
IEnumerable
,而不是
object
。(连接将在内存中执行)

IEnumerable reportData;
var resultData=来自reportData中的c
在((动态)c.MemberID等于((动态)p.MemberID)的PG_成员中加入p

您的不同实体能否实现一个通用接口?然后,您可以将变量声明为该接口类型,而不是
object
。(虽然我不能100%确定这在查询转换中是如何工作的。)四个表中的每一个都是EntityFramework的表,是自动生成的。所以没有任何公共接口。它们不是作为分部类生成的吗?这似乎不对。是的,它们是作为部分类生成的。我怀疑您(或您团队中的某个人)误解了“需求”。无论如何,下面另一位用户的回答是完全可以接受的“另一种方式”,并提供了一些关于开始简单化和重构模式的非常好的建议。您的不同实体能否实现一个公共接口?然后,您可以将变量声明为该接口类型,而不是
object
。(虽然我不能100%确定这在查询转换中是如何工作的。)四个表中的每一个都是EntityFramework的表,是自动生成的。所以没有任何公共接口。它们不是作为分部类生成的吗?这似乎不对。是的,它们是作为部分类生成的。我怀疑您(或您团队中的某个人)误解了“需求”。无论如何,下面另一位用户的回答是完全可以接受的“另一种方式”,并提供了一些关于开始简单操作和重构模式的非常好的建议。
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

}
IEnumerable<object> reportData;

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