C# 与在LINQ中动态选择对象相关的问题
我有一个MVC框架和EntityFramework中的Web应用程序 我一直陷于这样的境地:我必须根据运行时传递的某个值动态地选择一个对象 我有以下代码: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
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