我使用的是ASP.NET mvc 5.我有一个类可以容纳所有可以访问另一个类的LINQ。现在我将LINQ查询转换为列表变量Query并返回为IList ...我创建此类的对象 - >调用方法并获得结果。
现在我可以在调试对象名称中看到但我在foreach循环中看不到。我的列表保持混合数据类型,加上结果是从不同的表合并...
public IList GetAllFeeZonesForFeeSchemeByID(int FeeSchemeID)
{
using (var db = new QualificationContext())
{
var Query = from a in db.FeeScheme
join b in db.FeeZoneSchema.Where(c => c.FeeSchemeID == 1) on a.FeeSchemeID equals b.FeeSchemeID
join c in db.FeeZone on b.FeeZoneID equals c.FeeZoneID
select new
{
FeeScheme = a.FeeSchemeID,
FeeZone = b.FeeZoneID,
FeeZone_Description = c.FeeZoneDescription
};
return Query.ToList();
}
}
控制器类中的 foreach(var item in obj1.GetAllFeeZonesForFeeSchemeByID(1))
{
item.???? (can't access the object here....
}
非常感谢
答案 0 :(得分:2)
IList
是非泛型接口,它只包含非泛型IEnumerable
定义,它枚举了对象。因此item
的类型将为object
。这就是为什么你只能看到System.Object
类的成员。
您应该将item
强制转换为适当的类型,或者使用适当类型参数化的泛型集合。但是,在使用匿名对象时,不能同时使用这些方法,因为您不知道匿名类型名称。所以,你需要创建一个你可以投射到的类:
foreach(Foo item in obj1.GetAllFeeZonesForFeeSchemeByID(1))
或者用作方法返回类型的参数:
public IList<Foo> GetAllFeeZonesForFeeSchemeByID(int FeeSchemeID)
另一个选项是使用dynamic
类型,它将在运行时解析对象上的操作。您仍然无法使用IntelliSense,但您的代码可以正常工作:
foreach(dynamic item in obj1.GetAllFeeZonesForFeeSchemeByID(1))
{
// use item.FeeScheme
}
答案 1 :(得分:2)
您应该返回具体(非匿名类)的Generic IList
:
public IList<FeeSchemeModel> GetAllFeeZonesForFeeSchemeByID(int FeeSchemeID)
{
using (var db = new QualificationContext())
{
var Query = from a in db.FeeScheme
join b in db.FeeZoneSchema.Where(c => c.FeeSchemeID == 1) on a.FeeSchemeID equals b.FeeSchemeID
join c in db.FeeZone on b.FeeZoneID equals c.FeeZoneID
select new FeeSchemeModel
{
FeeScheme = a.FeeSchemeID,
FeeZone = b.FeeZoneID,
FeeZone_Description = c.FeeZoneDescription
};
return Query.ToList();
}
}
public class FeeSchemeModel
{
public int FeeScheme{get;set;}
public int FeeZone{get;set;}
public string FeeZone_Description{get;set;}
};
但如果您不使用IEnumerable<T>
的特殊功能,我建议您使用IList<T>
代替ToArray()
并使用ToList()
方法代替List<T>
方法(例如方法Add())