在IList中返回LINQ查询结果并将其读取到另一个类

时间:2014-01-28 15:28:42

标签: asp.net-mvc linq collections

我使用的是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....

        }
非常感谢

2 个答案:

答案 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())