【问题标题】:return LINQ Query result in IList and read it another class [duplicate]在 IList 中返回 LINQ 查询结果并读取另一个类 [重复]
【发布时间】:2014-01-28 23:52:45
【问题描述】:

我正在使用 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....

        }

非常感谢

【问题讨论】:

    标签: asp.net-mvc linq collections


    【解决方案1】:

    你应该返回 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;}
    };
    

    但如果你不使用List&lt;T&gt;的特殊功能(例如方法Add()),我建议使用IEnumerable&lt;T&gt;而不是IList&lt;T&gt;并使用ToArray()方法而不是ToList()方法

    【讨论】:

    • 我有来自两个映射类的数据(两个表),即我真的需要第三个表来映射这个查询吗???
    • 你不应该有桌子。只能打字。或者,您可以使用 foreach 在方法中内联您的方法。匿名类型仅在定义它的方法中可见。在其他方法中它是对象。
    【解决方案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
    }
    

    【讨论】:

    • 我有来自两个映射类的数据(两个表),即我真的需要第三个表来映射这个查询吗???
    • @toxic 如果你不想创建单独的类来保存这些数据,你可以使用动态类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2016-09-30
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多