我使用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;
}
但上面的代码也无效..
我怎样才能解决我的问题? 感谢
答案 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